Java對(duì)象不使用時(shí)賦值null的意義詳解
先看代碼
public class TestDemo1 { public static void main(String[] args) { if (true) { byte[] placeHolder = new byte[64 * 1024 * 1024]; System.out.println(placeHolder.length / 1024); } System.gc(); }}
idea配置gc日志打印
運(yùn)行上面的代碼,載圖gc日志
現(xiàn)在我們修改上面的測(cè)試代碼,將placeHolder置為null
public class TestDemo1 { public static void main(String[] args) { if (true) { byte[] placeHolder = new byte[64 * 1024 * 1024]; System.out.println(placeHolder.length / 1024); placeHolder = null; } System.gc(); }}
再次運(yùn)行程序,查看gc日志
由以上載圖日志可以明顯看到二者差別,所以不用對(duì)象置為null還是很有意義的。
為啥會(huì)造成二者的區(qū)別呢?
這還得從jvm認(rèn)定垃圾的機(jī)制:可達(dá)性分析說(shuō)起。
說(shuō)起這個(gè)可達(dá)性,首先就得說(shuō)到根,而“本地變量表”恰恰就可以看成是根。
上面兩段代碼本地變量表是不一樣的。
先看第一段代碼,就是placeHolder沒有置null的“本地變量表 ”
使用javap -v TestDemo1.class
可以看到placeHolder還在本地變量表中,而且它占用slot槽1號(hào)位置, 所以jvm認(rèn)為它還是活著的。
然后,我們?cè)倏磒laceHolder =null這段代碼的'本地變量表'的情況,其實(shí)它與上面一樣,看不出啥差別。
但是如果我們?cè)趐laceHolder后面再聲明一個(gè)變量
public class TestDemo1 { public static void main(String[] args) { if (true) { byte[] placeHolder = new byte[64 * 1024 * 1024]; System.out.println(placeHolder.length / 1024); } String name = 'admin'; System.gc(); }}
可以看到name這個(gè)變量名將slot槽1號(hào)位置占用了,是否可以說(shuō)明placeHolder沒啥用了呢
而且這段代碼與placeHolder = null的gc日志完全一樣。那么應(yīng)該可以說(shuō)明,我們聲明的這個(gè)String name = 'admin' 斷開了棧中placeHolder與堆中實(shí)例之間關(guān)系。
而placeHolder =null應(yīng)該也有這個(gè)功能。
總結(jié):代碼離開變量作用域時(shí),并不會(huì)自動(dòng)切斷其與堆的聯(lián)系。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. jsp cookie+session實(shí)現(xiàn)簡(jiǎn)易自動(dòng)登錄2. XML入門的常見問(wèn)題(二)3. asp中response.write("中文")或者js中文亂碼問(wèn)題4. asp取整數(shù)mod 有小數(shù)的就自動(dòng)加15. javascript xml xsl取值及數(shù)據(jù)修改第1/2頁(yè)6. css代碼優(yōu)化的12個(gè)技巧7. CSS3中Transition屬性詳解以及示例分享8. JSP 中request與response的用法詳解9. ASP基礎(chǔ)知識(shí)Command對(duì)象講解10. jsp+mysql實(shí)現(xiàn)網(wǎng)頁(yè)的分頁(yè)查詢
