真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Java對(duì)象不使用時(shí)賦值null的意義詳解

先看代碼

主要從事網(wǎng)頁設(shè)計(jì)、PC網(wǎng)站建設(shè)(電腦版網(wǎng)站建設(shè))、wap網(wǎng)站建設(shè)(手機(jī)版網(wǎng)站建設(shè))、響應(yīng)式網(wǎng)站、程序開發(fā)、微網(wǎng)站、小程序設(shè)計(jì)等,憑借多年來在互聯(lián)網(wǎng)的打拼,我們?cè)诨ヂ?lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)積累了豐富的成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、網(wǎng)絡(luò)營銷經(jīng)驗(yàn),集策劃、開發(fā)、設(shè)計(jì)、營銷、管理等多方位專業(yè)化運(yùn)作于一體,具備承接不同規(guī)模與類型的建設(shè)項(xiàng)目的能力。

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日志打印

Java對(duì)象不使用時(shí)賦值null的意義詳解

運(yùn)行上面的代碼,載圖gc日志

Java對(duì)象不使用時(shí)賦值null的意義詳解

現(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日志

Java對(duì)象不使用時(shí)賦值null的意義詳解

由以上載圖日志可以明顯看到二者差別,所以不用對(duì)象置為null還是很有意義的。

為啥會(huì)造成二者的區(qū)別呢?

這還得從jvm認(rèn)定垃圾的機(jī)制:可達(dá)性分析說起。

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

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

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

使用javap -v TestDemo1.class

Java對(duì)象不使用時(shí)賦值null的意義詳解

可以看到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();
  }
}

Java對(duì)象不使用時(shí)賦值null的意義詳解

可以看到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)系。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。


當(dāng)前標(biāo)題:Java對(duì)象不使用時(shí)賦值null的意義詳解
URL標(biāo)題:http://weahome.cn/article/jseseh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部