Java对象不使用时赋值null的意义详解

作者:我太难了008 时间:2023-11-25 01:46:20 

先看代码


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对象不使用时赋值null的意义详解

运行上面的代码,载图gc日志

Java对象不使用时赋值null的意义详解

现在我们修改上面的测试代码,将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日志

Java对象不使用时赋值null的意义详解

由以上载图日志可以明显看到二者差别,所以不用对象置为null还是很有意义的。

为啥会造成二者的区别呢?

这还得从jvm认定垃圾的机制:可达性分析说起。

说起这个可达性,首先就得说到根,而“本地变量表”恰恰就可以看成是根。

上面两段代码本地变量表是不一样的。

先看第一段代码,就是placeHolder没有置null的“本地变量表 ”

使用javap -v TestDemo1.class

Java对象不使用时赋值null的意义详解

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

Java对象不使用时赋值null的意义详解

可以看到name这个变量名将slot槽1号位置占用了,是否可以说明placeHolder没啥用了呢

而且这段代码与placeHolder = null的gc日志完全一样。那么应该可以说明,我们声明的这个String name = "admin" 断开了栈中placeHolder与堆中实例之间关系。

而placeHolder =null应该也有这个功能。

总结:代码离开变量作用域时,并不会自动切断其与堆的联系。

来源:https://www.cnblogs.com/z-qinfeng/p/12317084.html

标签:java,对象,赋值,null
0
投稿

猜你喜欢

  • C#判断一天、一年已经过了百分之多少的方法

    2022-07-16 15:23:11
  • Linux下java环境配置图文方法

    2021-10-24 06:22:52
  • SpringBoot 如何实现异步编程

    2023-04-15 13:45:43
  • WinForm项目中添加帮助文档功能

    2022-12-30 02:22:50
  • C#/VB.NET实现HTML转为XML的示例代码

    2021-08-13 20:46:48
  • Maven中怎么手动添加jar包到本地仓库详解(repository)

    2023-09-08 07:33:20
  • Android中通过样式来去除app的头及界面全屏(备忘)的实现方法

    2023-07-30 00:03:23
  • 详解Java如何在CompletableFuture中实现日志记录

    2022-03-21 17:11:01
  • C#泛型类创建与使用的方法

    2023-02-28 21:26:36
  • Python如何使用@property @x.setter及@x.deleter

    2021-12-23 13:55:30
  • @RequestBody的使用案例代码

    2021-07-11 16:46:50
  • SpringBoot拦截器的配置使用介绍

    2021-06-20 07:25:54
  • Springboot整合Dozer实现深度复制的方法

    2023-11-12 17:18:11
  • Android自定义弹窗提示效果

    2022-05-13 12:00:14
  • Flutter深色模式适配的实现

    2023-01-22 12:41:03
  • java8实现List中对象属性的去重方法

    2023-08-30 20:50:48
  • Android开发必知 九种对话框的实现方法

    2022-10-23 07:47:26
  • Java方法的覆盖与隐藏的区别分析

    2021-12-19 05:15:52
  • 详解Java中JSON数据的生成与解析

    2022-02-21 22:54:44
  • unity实现翻页按钮功能

    2021-07-15 03:33:47
  • asp之家 软件编程 m.aspxhome.com