進程:
文本區(qū)域、數(shù)據(jù)區(qū)域、和堆棧躯枢。
- 文本區(qū)域存儲處理器執(zhí)行的代碼。
- 數(shù)據(jù)區(qū)域存儲變量和進程執(zhí)行期間使用的動態(tài)分配的內(nèi)存槐臀。
- 堆棧區(qū)域存儲著活動調(diào)用過程調(diào)用的指令和本地變量锄蹂。
程序是一個沒有生命的實體,只有在服務(wù)器運行它時水慨,它才是一個活動的實體被稱為進程得糜。當一個程序進入內(nèi)存時敬扛,即變成一個進程。
進程狀態(tài):
進程還有三個狀態(tài)朝抖,就緒啥箭,運行和阻塞。
- 就緒狀態(tài):獲取了除cpu外的所有資源治宣,只要處理器分配資源就可以馬上執(zhí)行急侥。
- 運行狀態(tài):運行狀態(tài)就是獲得了處理器的資源,程序開機執(zhí)行侮邀。
- 阻塞態(tài):當程序執(zhí)行條件不夠坏怪,需要等待條件滿足時候才能執(zhí)行,例如等待i/o操作的時候绊茧。
進程通信
進程通信通過ipc機制铝宵,而線程通信則通過對全局字段的讀寫。需要進程間同步和互斥的手段的輔助华畏,以保證數(shù)據(jù)的一致性鹏秋。
常見的進程通信方式
- 管道:管道是一種半雙工通信方式,數(shù)據(jù)只能單向流動亡笑。而且只能在有親緣關(guān)系的進程間使用侣夷,這里一般指父子進程。
- 命名管道:有名管道也是一種半雙工的通信方式况芒,但是它允許不是親屬關(guān)系的進程通信惜纸。
- 消息隊列:消息隊列是由消息的鏈表,存放在內(nèi)核中并由消息隊列標識符標識绝骚。消息隊列克服了信號傳遞信息少,管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點祠够。
- 共享存儲:共享內(nèi)存就是映射一段能被其他進程訪問的內(nèi)存压汪,這段共享內(nèi)存由一個進程創(chuàng)建,但多個進程都可以進行訪問古瓤,共享內(nèi)存是最快的ipc方式止剖,它是針對其他進程間通信方式運行效率低而專門設(shè)計的。它往往與其他機制配合使用落君,來實現(xiàn)進程的同步和通信穿香。
- 信號量:信號量是一個計數(shù)器,可以控制多個進程對資源的訪問绎速,它常作為一種鎖機制皮获,防止某進程正在訪問資源時,其他進程也訪問該資源纹冤。因此作為進程之間以及同一進程內(nèi)的不同線程之間同步的手段洒宝。
- 套接字:套接口也是一種進程間通信機制购公,與其他機制不同的是,它可用于不同及其間的進程通信
- 信號:信號是一種比較復(fù)雜的通信方式雁歌,用于接收進程的某個事件已經(jīng)發(fā)生宏浩。
內(nèi)存溢出和內(nèi)存泄漏
- 內(nèi)存溢出:指程序在申請內(nèi)存時,沒有足夠的空間供其使用
- 內(nèi)存泄漏:指程序分配出去的內(nèi)存不再使用靠瞎,但無法進行回收
面對對象&面向過程
面向過程
1.優(yōu)點:性能比面對對象高比庄,因為類的調(diào)用需要實例化,開銷比較大
2.缺點:沒有面對對象容易維護
面向?qū)ο?/h6>
- 優(yōu)點:易維護乏盐、易復(fù)用佳窑、易拓展、由于面對對象有封裝繼承多態(tài)的特性丑勤,可以設(shè)計出低耦合的程序
2.缺點:性能比面向過程低
java的四個基本特性
2.缺點:性能比面向過程低
1.抽象:把現(xiàn)實生活中的某一類東西提取出來华嘹,成為該類東西特有的共同特性,抽象壁板分為數(shù)據(jù)抽象和過程抽象法竞,數(shù)據(jù)抽象是對象的屬性耙厚,過程抽象是對象的行為特征。
2.封裝:把客觀事物進行封裝成抽象類岔霸,該數(shù)據(jù)和方法只讓可信的類操作薛躬,對不可信的類隱藏,封裝分為屬性封裝和方法封裝呆细。
- 繼承:從已有的類中派生出新的類型宝,新的類吸收已有類的數(shù)據(jù)屬性和行為,并能擴展新的能力
4.多態(tài):同一個行為具有多個不同表現(xiàn)形式或形態(tài)的能力絮爷,多態(tài)的前提是類與類之間必須存在關(guān)系趴酣,要么繼承要么實現(xiàn)。
抽象類和接口的區(qū)別
1.抽象類和接口分別給出了不同的語法定義坑夯。
2.抽象是對類的抽象岖寞,接口是對行為的抽象。
3.抽象所體現(xiàn)的是繼承關(guān)系柜蜈,是一種“is -a ”關(guān)系仗谆,接口僅僅實現(xiàn)接口的定義的契約,是一種“l(fā)ike- a”關(guān)系
4.抽象是自底向上抽象的淑履,接口是自頂向下設(shè)計出來的隶垮。
自動拆箱和裝箱
Java采用了自動裝箱和拆箱機制,節(jié)省了常用數(shù)值的內(nèi)存開銷和創(chuàng)建對象的開銷秘噪,提高了效率
1.裝箱:將基本數(shù)據(jù)類型包裝成它們的引用類型
2.拆箱:將包裝類型轉(zhuǎn)換為基本數(shù)據(jù)類型
序列化和反序列化
- 對象的序列化:是把對象轉(zhuǎn)換成字節(jié)序列的過程狸吞。
- 對象的反序列化:是把字節(jié)序列恢復(fù)為對象的過程。
對象序列化的主要用途:
- 可以將字節(jié)永久的保存在硬盤中,通常放在文件中
- 可以在網(wǎng)絡(luò)上傳送字節(jié)序列
- 兩個線程在進行遠距離通信時捷绒,彼此可以發(fā)送各種類型瑰排,發(fā)送方需要把java對象轉(zhuǎn)換為字節(jié)序列,接收方字需要把字節(jié)序列再恢復(fù)為java對象暖侨。
編譯和運行
1.編譯時和運行時:
- 編譯時:將java文件編譯成.class文件的過程椭住,不涉及到內(nèi)存的分配。
- 運行時:將虛擬機執(zhí)行.class文件的過程字逗,設(shè)計到內(nèi)存的分配
- 編譯時類型和運行時類型
- 在編譯時京郑,調(diào)用的是聲明類型的成員方法
- 在運行時,調(diào)用的是實際類型的成員方法
- 對于調(diào)用引用實例的成員變量葫掉,無論是編譯還是運行些举,均是編譯時類型的成員變量
gc簡述
當程序員創(chuàng)建對象時,gc就開始監(jiān)控這個對象的地址俭厚,大小以及使用情況户魏。通常,gc采用有向圖的方式記錄管理堆中所有的對象挪挤,通過這種方式確定哪些對象時“可達的”叼丑,哪些對象是“不可達的”。當gc確定一些對象為不可達時扛门,gc就有責任回收這些內(nèi)存空間鸠信。但是,位置保證GC能夠在不同平臺實現(xiàn)的問題论寨,Java規(guī)范對gc的很對行為都沒有進行嚴格規(guī)定星立。(青年代老年代gc回收機制。)
java中的4中引用類型
- 強引用:從不回收葬凳,對象一直存在绰垂,當jvm停止的時候才被終止。
- 軟引用:可以和引用隊列聯(lián)合使用火焰,當內(nèi)存不足時終止辕坝。
- 弱引用:可以和引用隊列聯(lián)合使用,當內(nèi)存不足時觸發(fā)gc被終止
- 虛引用:必須和引用隊列李蘭和使用荐健,隨時會被回收,觸發(fā)gc后被終止琳袄。
軟應(yīng)用多用于緩存圖片內(nèi)存資源江场,而弱引用多用于內(nèi)存泄漏的解決。
弱引用可以通過手動gc進行清除
字符串相關(guān)
String窖逗、StringBuffer和StringBuilder
- 可變性
- String類使用數(shù)組保存字符串址否,所以String對象不可變。每次更改字符串都需要新建新的對象。
- StringBuffer類和StringBuilder類都是繼承AbstractStringBuilder類佑附。AbstractStringBuilder在更改字符串時不需要新建新的對象樊诺。消耗時間比String要短,性能好音同。但是StringBuffer比StringBuilder要稍微耗時一些词爬。是因為StringBuffer中添加了同步鎖,所以要求線程安全時要使用StringBuffer权均。