Java對象不使用時賦值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日志打印

運行上面的代碼,載圖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();
}
}
再次運行程序,查看gc日志

由以上載圖日志可以明顯看到二者差別,所以不用對象置為null還是很有意義的。
為啥會造成二者的區(qū)別呢?
這還得從jvm認(rèn)定垃圾的機制:可達性分析說起。
說起這個可達性,首先就得說到根,而“本地變量表”恰恰就可以看成是根。
上面兩段代碼本地變量表是不一樣的。
先看第一段代碼,就是placeHolder沒有置null的“本地變量表 ”
使用javap -v TestDemo1.class

可以看到placeHolder還在本地變量表中,而且它占用slot槽1號位置, 所以jvm認(rèn)為它還是活著的。
然后,我們再看placeHolder =null這段代碼的"本地變量表"的情況,其實它與上面一樣,看不出啥差別。
但是如果我們在placeHolder后面再聲明一個變量
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這個變量名將slot槽1號位置占用了,是否可以說明placeHolder沒啥用了呢
而且這段代碼與placeHolder = null的gc日志完全一樣。那么應(yīng)該可以說明,我們聲明的這個String name = "admin" 斷開了棧中placeHolder與堆中實例之間關(guān)系。
而placeHolder =null應(yīng)該也有這個功能。
總結(jié):代碼離開變量作用域時,并不會自動切斷其與堆的聯(lián)系。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Springboot項目消費Kafka數(shù)據(jù)的方法
本文詳細(xì)介紹了如何在Spring Boot項目中配置和實現(xiàn)Kafka消費者和生產(chǎn)者,結(jié)合實例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-01-01
Spring中@Value讀取properties作為map或list的操作
這篇文章主要介紹了Spring中@Value讀取properties作為map或list的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
springboot openfeign從JSON文件讀取數(shù)據(jù)問題
今天主要說一下在openfeign里讀取JSON文件的問題,我們將測試所需要的數(shù)據(jù)存儲到文件里,在修改時關(guān)注點比較單純2018-06-06
SpringBoot+Ant Design Vue實現(xiàn)數(shù)據(jù)導(dǎo)出功能方式
這篇文章主要介紹了SpringBoot+Ant Design Vue實現(xiàn)數(shù)據(jù)導(dǎo)出功能方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01

