本文是自己在復(fù)習(xí)java基礎(chǔ)知識(shí)時(shí)對(duì)內(nèi)存管理部分進(jìn)行的一點(diǎn)小小的梳理,有不對(duì)的地方還望各位大神指點(diǎn),歡迎分享。
1.內(nèi)存泄漏:由于某種原因使分配的內(nèi)存始終沒(méi)有得到釋放。如果該任務(wù)不斷的重復(fù),程序最終會(huì)耗盡內(nèi)存并異常終止,至少無(wú)法運(yùn)行。Java不要求程序員顯示分配內(nèi)存和釋放內(nèi)存,當(dāng)創(chuàng)建對(duì)象時(shí)會(huì)自動(dòng)分配內(nèi)存,當(dāng)該對(duì)象的引用不存在時(shí)釋放該內(nèi)存。在java中,內(nèi)存泄漏:1)對(duì)象可達(dá),即在有向圖中,存在通路可以與其相連;2)對(duì)象是無(wú)用的,即程序以后不會(huì)再使用這些對(duì)象。如果滿足這兩個(gè)條件,這些對(duì)象就可以判定為Java中的內(nèi)存泄漏。在Java中,GC線程的優(yōu)先級(jí)別較低。
2.Java中使用垃圾收集器技術(shù)來(lái)監(jiān)視程序的運(yùn)行狀態(tài)。這里會(huì)引用一種叫軟指針(不直接指向?qū)ο螅侵赶驅(qū)ο蟮囊茫┑母拍?。Java使用軟指針來(lái)跟蹤對(duì)象的各個(gè)引用,并用一個(gè)對(duì)象表將這些軟指針映射為對(duì)象的引用,使用軟指針,垃圾收集器能夠以單獨(dú)的線程在后臺(tái)運(yùn)行,并依次檢查每個(gè)對(duì)象。通過(guò)更改對(duì)象表項(xiàng),垃圾收集器可以標(biāo)記對(duì)象,移除對(duì)象,移動(dòng)對(duì)象或檢查對(duì)象。
3.垃圾收集器是自動(dòng)運(yùn)行的,一般情況下,無(wú)需顯示的請(qǐng)求垃圾收集器,程序運(yùn)行時(shí),垃圾收集器會(huì)不時(shí)檢查對(duì)象的各個(gè)引用,并回收無(wú)引用對(duì)象所占用的空間。調(diào)用System類中的靜態(tài)方法gc()可以運(yùn)行垃圾收集器,但并不能保證立即回收指定對(duì)象。
4.Java垃圾回收機(jī)制:gc即垃圾回收機(jī)制,是指JVM用于釋放那些不再使用的對(duì)象所占的內(nèi)存。Java的垃圾回收機(jī)制是為所有的進(jìn)程服務(wù)的,而不是為了某個(gè)特定的進(jìn)程服務(wù),因此任何一個(gè)進(jìn)程都不能命令垃圾回收機(jī)制做什么,怎么做,做多少。在垃圾回收器收集一個(gè)對(duì)象之前,一般要求程序調(diào)用適當(dāng)?shù)姆椒ㄡ尫刨Y源,這個(gè)方法就是finalize()。原型是protected void finalize() throws Throwable。在該方法返回之后,對(duì)象消失,垃圾回收器開(kāi)始執(zhí)行。
5.在Java中程序員通過(guò)使用new關(guān)鍵字申請(qǐng)內(nèi)存空間,所有的對(duì)象都在堆中分配空間,釋放是由GC決定和執(zhí)行。正因?yàn)槿绱?,加重了JVM的負(fù)擔(dān),這就造成了java程序運(yùn)行較慢(原因之一)。因?yàn)镚C要監(jiān)控每一個(gè)對(duì)象的運(yùn)行狀態(tài),包括對(duì)象的申請(qǐng),引用,被引用和賦值等。
堆棧:
1.Java中把內(nèi)存劃分為2種,一種是棧內(nèi)存,一種是堆內(nèi)存。棧:存取速度比堆快,僅次于直接位于CPU中的寄存器,但缺點(diǎn)是存在于棧中的數(shù)據(jù)大小與生存周期必須是確定的,缺乏靈活性,另外棧數(shù)據(jù)可以共享。堆:動(dòng)態(tài)分配內(nèi)存大小,生存周期也不必事先告訴編譯器,java垃圾收集器會(huì)自動(dòng)收走這些不再使用的數(shù)據(jù)。缺點(diǎn)是,由于要在運(yùn)行時(shí)動(dòng)態(tài)分配內(nèi)存,存取速度慢。
2.8種基本數(shù)據(jù)類型(int, short, long, byte, float, double, boolean, char)是存在于棧中,而且還有數(shù)據(jù)共享的功能。int a = 3;int b = 3;這里在棧中只存在一個(gè)3,而且a = 4,也不會(huì)影響b的值,b還是3.對(duì)于String str = "abc";同樣適用,但不適用于String str = new String("abc");
3.棧主要存放一些基本數(shù)據(jù)類型的變量和對(duì)象句柄(對(duì)象的引用)。在堆中產(chǎn)生了一個(gè)數(shù)組或?qū)ο蠛?,還可以在棧中定義一個(gè)特殊的變量,讓棧中這個(gè)變量的取值等于數(shù)組或?qū)ο笤诙褍?nèi)存中的首地址,棧中的這個(gè)變量就成了數(shù)組或?qū)ο蟮囊米兞?。引用變量就相?dāng)于是為數(shù)組或?qū)ο笃鸬囊粋€(gè)名稱,以后就可以在程序中使用棧中的引用變量來(lái)訪問(wèn)堆中的數(shù)組或?qū)ο蟆?/p>
4.我們?cè)谑褂弥T如String str = "abc";的格式定義類時(shí),總是想當(dāng)然地認(rèn)為,創(chuàng)建了String類的對(duì)象str,不一定,因?yàn)槿绻孪葲](méi)有,那么就會(huì)創(chuàng)建,如果原來(lái)就有,那就指向那個(gè)原來(lái)的對(duì)象就可以了!只有通過(guò)new()方法才能保證每次都創(chuàng)建一個(gè)新的對(duì)象。由于String類的immutable性質(zhì),當(dāng)String變量需要經(jīng)常變換其值時(shí),應(yīng)該考慮使用StringBuffer類,以提高程序效率。
注:更加深入的垃圾回收以及內(nèi)存管理機(jī)制參考印象筆記中的相關(guān)筆記。