Java对象不使用时赋值null的意义详解
作者:我太难了008 发布时间:2023-11-25 01:46:20
标签: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应该也有这个功能。
总结:代码离开变量作用域时,并不会自动切断其与堆的联系。
来源:https://www.cnblogs.com/z-qinfeng/p/12317084.html


猜你喜欢
- JWT可以理解为一个加密的字符串,里面由三部分组成:头部(Header)、负载(Payload)、签名(signature)由base64加
- 一、@EnableTransactionManagement工作原理开启Spring事务本质上就是增加了一个Advisor,但我们使用 @E
- 对已有的apk文件进行重新打包,前面 Android签名机制:生成keystore、签名、查看签名信息 已经介绍了。本文介绍另外两种需求。使
- 本文实例讲述了C#操作SQLite方法。分享给大家供大家参考。具体分析如下:地址:System.Data.Sqlite入手。。。首先impo
- 前言记得去年做一个聊天项目需要实现类似QQ的下拉刷新并且有侧滑删除的功能,在网上找了很久都没有QQ的完美,多多少少存在各种的问题,最后把下拉
- C#在程序中定义和使用自定义事件可以分为以下几个步骤:步骤1:在类中定义事件using System;public class TestCl
- 目录1. #define 和 #undef2. #if、#elif、#else 和#endif3. #warning 和 #error4.
- mybatis Integer类型参数动态sql注意条件例如以下拼接的动态sql<if test="work_status
- 问题是这样的,我用eclipse发送httpclient请求如下没有问题,但是在idea中就返回400,为毛呢???excuse me?pa
- 最新idea2020安装部署超详细教程懂得懂的2020.32020.2.42020.2.32020.2.220.2.12019.32018.
- 1.面对对象的初步认识1.1什么是面向对象用面向对象的思想来涉及程序,更符合人们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好。1
- 一个围绕统计分析功能的系统,在最后制作统计分析时需要一个批量点击的功能,用以批量制作echarts图形后生成图片并保存图形和图片。方便后续导
- Tomcat 如何实现WebSocketWebSocket协议属于HTML5标准,越来越多浏览器已经原生支持WebSocket,它能让客户端
- C# goto 语句用于直接在一个程序中转到程序中的标签指定的位置,标签实际上由标识符加上冒号构成。语法形式如下。goto Labell;
- 起因unity程序build到pc上,拿到其他人的机器上结果有些功能不正常,看log里面大概是Fallback handler could
- 在layout文件中使用自定义的View时遇到如下错误:12-11 17:28:26.962: ERROR/AndroidRuntime(1
- 这篇讲的是如何生成一个自定义的ImageView,实现自动放大缩小动画。 为什么实现这个功能呢?因为我想在ViewPager实现图片放大缩小
- 1.例如下面的代码片段,Toast类的第一个参数接受一个Context对象:@Override protected Dialog onCr
- 摘要:介绍使用Java Stream流排序器Comparator对List集合进行多字段排序的方法,包括复杂实体对象多字段升降序排序方法。综
- 一般使用@RequestBody接收的时候报400都是传入的json字符串和对应封装的对象不对应造成的首先要注意封装的对象中的字段类型有没有