先看代码

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的意义详解相关推荐

  1. JAVA中希尔排序去的讲解_java 中基本算法之希尔排序的实例详解

    java 中基本算法之希尔排序的实例详解 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shel ...

  2. java timer.schedule如何控制执行次数_Java 分布式任务调度平台:PowerJob 快速开始+配置详解...

    本文适合有 Java 基础知识的人群 作者:HelloGitHub-Salieri 引言 HelloGitHub 推出的<讲解开源项目>[1]系列. 项目地址: https://githu ...

  3. java中四种操作(DOM、SAX、JDOM、DOM4J)xml方式详解与比较(转)

    java中四种操作(DOM.SAX.JDOM.DOM4J)xml方式详解与比较(转) http://wishlife.javaeye.com/blog/181865 posted on 2010-12 ...

  4. java 判断对象的属性是否为空_Java 判断实体对象及所有属性是否为空的操作

    1.判断实体对象是否为空 2.判断对象所有属性是否为空 3.特别注意,实体类中如果有基本数据类型,会影响判断 package com.liuxd.object; import org.apache.c ...

  5. java 2分代复制垃圾回收_Java对象的后事处理——垃圾回收(二)

    1 先谈Finalize() finalize()能做的所有工作,使用try-finally或者其他方式都可以做得更好.更及时,所以笔者建议大家完全可以忘掉Java语言中有这个方法的存在. --< ...

  6. java怎么判断json是否为空_java判断jsonObject和jsonArray是否为空

    resJsonObj = {"res":"0","msg":"","data":{"Nam ...

  7. java list 之详解_java集合(二)List集合之ArrayList详解

    前言: 有序列表,允许存放重复的元素: 实现类: ArrayList:数组实现,查询快,增删慢,轻量级:(线程不安全) LinkedList:双向链表实现,增删快,查询慢 (线程不安全) Vector ...

  8. java metadata 使用_java 查询oracle数据库所有表DatabaseMetaData的用法(详解)

    一 . 得到这个对象的实例 Connection con ; con = DriverManager.getConnection(url,userName,password); DatabaseMet ...

  9. java 查询sql语句_java执行SQL语句实现查询的通用方法详解

    完成sql查询 并将查询结果放入vector容器,以便其他程序使用 /* * 执行sql查询语句 */ public static vector executequery(class clazz, s ...

  10. java condition详解_Java使用Condition控制线程通信的方法实例详解

    Java使用Condition控制线程通信的方法实例详解 发布于 2020-4-20| 复制链接 摘记: 本文实例讲述了Java使用Condition控制线程通信的方法.分享给大家供大家参考,具体如下 ...

最新文章

  1. 一道拉普拉斯逆变换练习题和对应的数值计算方法
  2. 网上收集下boost::asio发送与传输相关的几个函数,老是忘记
  3. Linux常用命令-入门
  4. 最简单java设计模式:抽象工厂模式
  5. 计算机硬件的维护知识,计算机硬件维护知识
  6. lightswitch 添加 TreeView 控件
  7. zabbix3.4监控java_CentOS7,zabbix3.4通过,zabbix-Java-gateway监控Tomcat
  8. 荣耀折叠屏手机发布日期曝光?将主打年轻用户
  9. [转]web实时视频流从0到1(ffmpeg+nginx-http-flv-module+flv.js)
  10. android9.0 uri,Android9.0源码学习 - Launcher Activity(一)
  11. 十进制转换成二进制java_计算机为什么采用二进制?
  12. ArcGIS 对DEM数据进行剖面分析
  13. bat批处理之for循环
  14. 【IP 笔记 2.】北邮 互联网协议 Internet Protocol - Transport Layer
  15. 数据清洗第六章—课后操作题
  16. 服务器网站中断,如何解决无法打开网页及服务器已断开连接的问题?
  17. 想设计一个母亲节小程序c语言,用小程序做一张精美海报,对母亲说一句:祝您母亲节快乐!...
  18. 遗传算法三种交叉算子(OX、PMX、CX)
  19. DataBaby | 跨服务器异构数据库查询结果整合实验 跨库Table合并 全自助查询、对账系统探路之行
  20. 2017高考计算机试卷,2017年高考模拟试卷 信息技术卷.doc

热门文章

  1. Node.js web框架Clouda初接触
  2. ImportError:cannot import name ‘save_state_warning‘和解决torch1.7.1报分布式错误No rendezvous handler for env:
  3. 【树】B056_LQ_三角形面积 阅兵方阵 版本分支(递归预处理)
  4. 再无风清扬,再有少年郎
  5. oracle数据库长连接和短连接,tcp 长连接与短连接
  6. 我迟早被这些AI绘画笑死...
  7. win7_ fiddler 证书安装失败解决方法
  8. 我的世界如何制作一个空岛服务器,我的世界1.7.10 God 世界空岛服务器
  9. android前置拍照镜像代码,在Android中镜像前置摄像头
  10. 【C++】输出公元1900-2100年之间所有闰年的年号,每5个一行