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)在我們修改上面的測試代碼,將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á)性分析說起。
說起這個(gè)可達(dá)性,首先就得說到根,而“本地變量表”恰恰就可以看成是根。
上面兩段代碼本地變量表是不一樣的。
先看第一段代碼,就是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)位置占用了,是否可以說明placeHolder沒啥用了呢
而且這段代碼與placeHolder = null的gc日志完全一樣。那么應(yīng)該可以說明,我們聲明的這個(gè)String name = "admin" 斷開了棧中placeHolder與堆中實(shí)例之間關(guān)系。
而placeHolder =null應(yīng)該也有這個(gè)功能。
總結(jié):代碼離開變量作用域時(shí),并不會(huì)自動(dòng)切斷其與堆的聯(lián)系。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java實(shí)現(xiàn)的斷點(diǎn)續(xù)傳功能的示例代碼
本篇文章主要介紹了Java實(shí)現(xiàn)的斷點(diǎn)續(xù)傳功能的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02SpringCloud Eureka Provider及Consumer的實(shí)現(xiàn)
這篇文章主要介紹了SpringCloud Eureka 提供者及調(diào)用者的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10springboot整合mybatis實(shí)現(xiàn)數(shù)據(jù)庫的更新批處理方式
這篇文章主要介紹了springboot整合mybatis實(shí)現(xiàn)數(shù)據(jù)庫的更新批處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03Java 實(shí)戰(zhàn)圖書管理系統(tǒng)的實(shí)現(xiàn)流程
讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實(shí)現(xiàn)一個(gè)圖書管理系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平2021-11-11springboot Rabbit MQ topic 配置文件綁定隊(duì)列和交換機(jī)的
本文詳細(xì)講解了在SpringBoot中使用RabbitMQ進(jìn)行隊(duì)列與交換機(jī)的綁定方法,包括創(chuàng)建交換機(jī)、隊(duì)列和綁定它們的步驟,以及如何發(fā)送和接收消息,適用于開發(fā)高并發(fā)系統(tǒng),如秒殺系統(tǒng)等2024-09-09IDEA項(xiàng)目maven?project沒有出現(xiàn)plugins和Dependencies問題
這篇文章主要介紹了IDEA項(xiàng)目maven?project沒有出現(xiàn)plugins和Dependencies問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12詳解Java如何優(yōu)雅的調(diào)用dubbo同時(shí)不使用其它jar包
這篇文章主要介紹了如何在不使用他人jar包的情況下優(yōu)雅的進(jìn)行dubbo調(diào)用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-02-02