java 给对象赋值null_Java对象不使用时赋值null的意义详解_彼得威的博客-程序员宅基地

技术标签: 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日志打印

18a032679b10d2bbb409f2a930a1ea71.png

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

ff43d7871227c5b9742e67f845a54d77.png

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

83619dc236391030f8f3d23c0db559f3.png

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

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

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

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

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

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

使用javap -v TestDemo1.class

d0110e6f94c6fc5c64cef4c8d6a14baf.png

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

}

}

ca3c616b71fe85ece4866dcc85b29d96.png

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

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

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自学编程网。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30877741/article/details/114504078

智能推荐

jdbc-query(new PreparedStatementCreator(),new PreparedStatementSetter(),new ResultSetExtractor<Objec_bluss-yang的博客-程序员宅基地

public List queryPreparedStatementSetter(){    final String insertSql = "select *from  users where id =?";          final List result = new ArrayList();         jdbcTemplate.query(new PreparedSt

pytorch中张量的三种创建方式(有代码实现)_创建一个3×3且所有元素均为0的张量代码正确的是_码龄为零的程序员的博客-程序员宅基地

import torchimport numpy as nptorch.tensor(data, dtype=None, device=None, requiers_grad=False,pin_memory=False) # 从data创建tensordata:数据,可以是list,numpydtype:数据类型,默认与data一致device:所在设备 gpu/cpurequores_grad:是否需要梯度pin_memory:是否存于锁页内存torch.from_numpy(n

Android-OptionMenu选项菜单_安卓 的 optionsmenu_Vivinia_Vivinia的博客-程序员宅基地

目标效果:   程序运行,点击右上角的三个点可现实菜单列表,点击列表中的“新页面”,可以跳转到图二所示的第二个页面,点击列表中“设置”和“确定”,可以吐司打印信息。1.activity_main.xml页面放置TextView控件。activity_main.xml页面:<RelativeLayout xmlns:android="http://schema

java实现FTP和 SFTP连接远程服务器下载文件_连接服务器下载_灰太狼yyds的博客-程序员宅基地

java实现FTP和 SFTP连接远程服务器下载文件文章目录java实现FTP和 SFTP连接远程服务器下载文件前言一、FTP是什么?如何实现。1.实现代码二、SFTP是什么?如何实现。1.代码实现总结前言为什魔写这片文章呢,因为关于ftp和sftp的文章介绍的太少啦 。提示:以下是本篇文章正文内容,下面案例可供参考一、FTP是什么?如何实现。来自百度百科 :文件传输协议(File Transfer Protocol,FTP)是用于在网络上进行文件传输的一套标准协议,它工作在 OSI 模型

程序员面试宝典_浩瀚之水_csdn的博客-程序员宅基地

第一部分:C++第二部分:嵌入式

js 设置password placeholder样式_150+ 个优质的 Node.js 包和资源_weixin_39627697的博客-程序员宅基地

持续更新,最新内容访问 GitHub 地址:https://github.com/zerolab-fe/awesome-nodejsAIbrain.js - 基于模型训练的神经网络 JS 库,支持浏览器和 Nodetfjs - TensorFlow JS 版本Build toolspkg - 将 Node.js 项目打包成可执行文件gulp - 基于流(stream)的自动化构建工具pa...

随便推点

命令行输入‘javac’无反应,输入‘java -version’有反应的解决方案_javac没反应_LC今天刷LC了吗的博客-程序员宅基地

命令行输入‘javac’无反应,输入‘java -version’有反应的解决方案解决方案:解决方案:“%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; ”这个是放在path的头部、头部、头部的!!!必须要放在第一个位置,这样输入javac就会正确输出了。...

MAC OS 下sourceTree总是提示输入密码的解决办法_nciasd的博客-程序员宅基地

参照如下命令,在你的项目所在目录依次执行,就可以解决问题。curl http://github-media-downloads.s3.amazonaws.com/osx/git-credential-osxkeychain -o git-credential-osxkeychainmv git-credential-osxkeychain /usr/local/binchmod u+x /usr

springboot整合shiro实现权限控制_springboot权限系统_卧龙不言的博客-程序员宅基地

Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码学和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。上个月写了一个在线教育的项目用到了shiro权限控制,这几天又复盘了一下,对其进行了深入探究,来总结一下。下面所总结的有关shiro的代码已经传到我的github上,可以访问下面的......

postgresql 快速入门-5_pg cascade_闫辉_13510215218的博客-程序员宅基地

概述本文基于pg 官方文档第5章“数据定义",归纳和总结相应的知识点。主要包括:约束、修改表定义、模式、表分区等。默认值定义语法:CREATE TABLE products ( product_no integer, name text, price numeric DEFAULT 9.99);...

LOJ #3272. 「JOISC 2020 Day1」汉堡肉 (2-sat)_Freopen的博客-程序员宅基地

题目求出最右的左边界,最左的右边界,最上的下边界,最下的上边界。K≤3K\leq 3K≤3时必有一个牙签插在两个边界的交点。那么O(4)O(4)O(4)枚举插在哪个交点爆搜,深度是KKK,时间复杂度O(n4K)O(n4^K)O(n4K)K=4K = 4K=4的时候我们必有一种方案可以在每个最边界上都放一个点。所以和3个边界以上有交的就一定会被插到,我们只需要考虑和两个一下边界有交的矩形,考虑2−sat2-sat2−sat。那么和两个边界有交的就变成了两种选择(选择在哪个边上被插),在一条边界

Linux 电源管理在ARM上的实现原理_"remove_proc_entry(\"suspend_finished\", null);"_别说郁闷的博客-程序员宅基地

内核版本号:linux2.6.32  由于arm系统中没有bios设备, 所以只能为arm系统创建一个虚拟的字符设备与用户空间进行通讯. 即在apm中实现一个misc设备,实质上也是一个字符设备, misc设备的主设备号是10, 而apm_bios作为个misc设备, 次设备号是134。 Linux2.6.30.10内核的/drivers/char/apm-emulation.c提供了

推荐文章

热门文章

相关标签