本文是自己在復(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ū)ο蟮囊茫┑母拍蠲爻怠ava使用軟指針來(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ì)象消失峰髓,垃圾回收器開始執(zhí)行傻寂。
5.在Java中程序員通過(guò)使用new關(guān)鍵字申請(qǐng)內(nèi)存空間,所有的對(duì)象都在堆中分配空間携兵,釋放是由GC決定和執(zhí)行疾掰。正因?yàn)槿绱耍又亓薐VM的負(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ū)ο蟮囊米兞考肭颉R米兞烤拖喈?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)筆記溶浴。