日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java 对象给对象赋值为空_Java对象不使用时赋值null的意义详解

發布時間:2023/12/18 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 对象给对象赋值为空_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日志

現在我們修改上面的測試代碼,將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還是很有意義的。

為啥會造成二者的區別呢?

這還得從jvm認定垃圾的機制:可達性分析說起。

說起這個可達性,首先就得說到根,而“本地變量表”恰恰就可以看成是根。

上面兩段代碼本地變量表是不一樣的。

先看第一段代碼,就是placeHolder沒有置null的“本地變量表 ”

使用javap -v TestDemo1.class

可以看到placeHolder還在本地變量表中,而且它占用slot槽1號位置, 所以jvm認為它還是活著的。

然后,我們再看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日志完全一樣。那么應該可以說明,我們聲明的這個String name = "admin" 斷開了棧中placeHolder與堆中實例之間關系。

而placeHolder =null應該也有這個功能。

總結:代碼離開變量作用域時,并不會自動切斷其與堆的聯系。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

總結

以上是生活随笔為你收集整理的java 对象给对象赋值为空_Java对象不使用时赋值null的意义详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。