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日志打印
运行上面的代码,载图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应该也有这个功能。
总结:代码离开变量作用域时,并不会自动切断其与堆的联系。
来源:https://www.cnblogs.com/z-qinfeng/p/12317084.html
标签:java,对象,赋值,null
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
C#判断一天、一年已经过了百分之多少的方法
2022-07-16 15:23:11
![](https://img.aspxhome.com/file/2023/0/68660_0s.png)
Linux下java环境配置图文方法
2021-10-24 06:22:52
![](https://img.aspxhome.com/file/2023/0/70300_0s.png)
SpringBoot 如何实现异步编程
2023-04-15 13:45:43
WinForm项目中添加帮助文档功能
2022-12-30 02:22:50
![](https://img.aspxhome.com/file/2023/1/119541_0s.png)
C#/VB.NET实现HTML转为XML的示例代码
2021-08-13 20:46:48
![](https://img.aspxhome.com/file/2023/5/87045_0s.png)
Maven中怎么手动添加jar包到本地仓库详解(repository)
2023-09-08 07:33:20
![](https://img.aspxhome.com/file/2023/3/82013_0s.jpg)
Android中通过样式来去除app的头及界面全屏(备忘)的实现方法
2023-07-30 00:03:23
详解Java如何在CompletableFuture中实现日志记录
2022-03-21 17:11:01
C#泛型类创建与使用的方法
2023-02-28 21:26:36
![](https://img.aspxhome.com/file/2023/3/96433_0s.jpg)
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
![](https://img.aspxhome.com/file/2023/5/92655_0s.png)
Springboot整合Dozer实现深度复制的方法
2023-11-12 17:18:11
Android自定义弹窗提示效果
2022-05-13 12:00:14
![](https://img.aspxhome.com/file/2023/6/101826_0s.jpg)
Flutter深色模式适配的实现
2023-01-22 12:41:03
![](https://img.aspxhome.com/file/2023/0/138710_0s.jpg)
java8实现List中对象属性的去重方法
2023-08-30 20:50:48
Android开发必知 九种对话框的实现方法
2022-10-23 07:47:26
![](https://img.aspxhome.com/file/2023/2/93282_0s.jpg)
Java方法的覆盖与隐藏的区别分析
2021-12-19 05:15:52
详解Java中JSON数据的生成与解析
2022-02-21 22:54:44
unity实现翻页按钮功能
2021-07-15 03:33:47
![](https://img.aspxhome.com/file/2023/4/113684_0s.jpg)