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的意义详解相关推荐
- JAVA中希尔排序去的讲解_java 中基本算法之希尔排序的实例详解
java 中基本算法之希尔排序的实例详解 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shel ...
- java timer.schedule如何控制执行次数_Java 分布式任务调度平台:PowerJob 快速开始+配置详解...
本文适合有 Java 基础知识的人群 作者:HelloGitHub-Salieri 引言 HelloGitHub 推出的<讲解开源项目>[1]系列. 项目地址: https://githu ...
- java中四种操作(DOM、SAX、JDOM、DOM4J)xml方式详解与比较(转)
java中四种操作(DOM.SAX.JDOM.DOM4J)xml方式详解与比较(转) http://wishlife.javaeye.com/blog/181865 posted on 2010-12 ...
- java 判断对象的属性是否为空_Java 判断实体对象及所有属性是否为空的操作
1.判断实体对象是否为空 2.判断对象所有属性是否为空 3.特别注意,实体类中如果有基本数据类型,会影响判断 package com.liuxd.object; import org.apache.c ...
- java 2分代复制垃圾回收_Java对象的后事处理——垃圾回收(二)
1 先谈Finalize() finalize()能做的所有工作,使用try-finally或者其他方式都可以做得更好.更及时,所以笔者建议大家完全可以忘掉Java语言中有这个方法的存在. --< ...
- java怎么判断json是否为空_java判断jsonObject和jsonArray是否为空
resJsonObj = {"res":"0","msg":"","data":{"Nam ...
- java list 之详解_java集合(二)List集合之ArrayList详解
前言: 有序列表,允许存放重复的元素: 实现类: ArrayList:数组实现,查询快,增删慢,轻量级:(线程不安全) LinkedList:双向链表实现,增删快,查询慢 (线程不安全) Vector ...
- java metadata 使用_java 查询oracle数据库所有表DatabaseMetaData的用法(详解)
一 . 得到这个对象的实例 Connection con ; con = DriverManager.getConnection(url,userName,password); DatabaseMet ...
- java 查询sql语句_java执行SQL语句实现查询的通用方法详解
完成sql查询 并将查询结果放入vector容器,以便其他程序使用 /* * 执行sql查询语句 */ public static vector executequery(class clazz, s ...
- java condition详解_Java使用Condition控制线程通信的方法实例详解
Java使用Condition控制线程通信的方法实例详解 发布于 2020-4-20| 复制链接 摘记: 本文实例讲述了Java使用Condition控制线程通信的方法.分享给大家供大家参考,具体如下 ...
最新文章
- 一道拉普拉斯逆变换练习题和对应的数值计算方法
- 网上收集下boost::asio发送与传输相关的几个函数,老是忘记
- Linux常用命令-入门
- 最简单java设计模式:抽象工厂模式
- 计算机硬件的维护知识,计算机硬件维护知识
- lightswitch 添加 TreeView 控件
- zabbix3.4监控java_CentOS7,zabbix3.4通过,zabbix-Java-gateway监控Tomcat
- 荣耀折叠屏手机发布日期曝光?将主打年轻用户
- [转]web实时视频流从0到1(ffmpeg+nginx-http-flv-module+flv.js)
- android9.0 uri,Android9.0源码学习 - Launcher Activity(一)
- 十进制转换成二进制java_计算机为什么采用二进制?
- ArcGIS 对DEM数据进行剖面分析
- bat批处理之for循环
- 【IP 笔记 2.】北邮 互联网协议 Internet Protocol - Transport Layer
- 数据清洗第六章—课后操作题
- 服务器网站中断,如何解决无法打开网页及服务器已断开连接的问题?
- 想设计一个母亲节小程序c语言,用小程序做一张精美海报,对母亲说一句:祝您母亲节快乐!...
- 遗传算法三种交叉算子(OX、PMX、CX)
- DataBaby | 跨服务器异构数据库查询结果整合实验 跨库Table合并 全自助查询、对账系统探路之行
- 2017高考计算机试卷,2017年高考模拟试卷 信息技术卷.doc
热门文章
- Node.js web框架Clouda初接触
- ImportError:cannot import name ‘save_state_warning‘和解决torch1.7.1报分布式错误No rendezvous handler for env:
- 【树】B056_LQ_三角形面积 阅兵方阵 版本分支(递归预处理)
- 再无风清扬,再有少年郎
- oracle数据库长连接和短连接,tcp 长连接与短连接
- 我迟早被这些AI绘画笑死...
- win7_ fiddler 证书安装失败解决方法
- 我的世界如何制作一个空岛服务器,我的世界1.7.10 God 世界空岛服务器
- android前置拍照镜像代码,在Android中镜像前置摄像头
- 【C++】输出公元1900-2100年之间所有闰年的年号,每5个一行