JVM 性能调优 - 四种引用(4)

为什么会有四种引用

我们先回顾下在 Java 虚拟机内存体系(1) 中提到了的垃圾回收算法

1、引用计数法

原理:给对象添加一个引用计数器,每当有一个地方引用它,计数器的值就加一。每当有一个引用失效,计数器的值就减一。当计数器值为零时,这个对象被认为没有其他对象引用,可当作垃圾回收。

缺点:需要维护引用计数器,有一定的消耗。且较难处理循环引用的问题。(现在基本没有地方使用这种算法了,了解即可)。

2、可达性分析算法

先想象一下生活中的场景,假设张三这个人有一条狗,狗被系着一条绳子。如下图所示:

如果张三把狗遗弃了,那么这条狗和绳子就没有关联关系了,狗会被抓狗队抓起来送到宠物收容所。这里可以把张三当作 GC Roots,张三和狗之间断了联系,那么狗和绳子都会被回收。如下图所示:

可达性分析算法原理:通过一系称为 GC Roots 的对象作为起始点,从 GC Roots 的对象出发,向下搜索,如果找到的对象和 GC Roots 有直接引用或间接引用关系,则说明这个对象不是垃圾,否则,这个对象就是垃圾。

Java 中对引用的传统定义:如果 reference 类型的数据中存储的数值代表是另外一块内存的起始地址,就称 reference 数据是代表某块内存、某个对象的引用。

但是这种定义比较简单,只有被引用未被引用 两种状态。如果有些对象没什么用,但是又不想丢弃,就让它留在内存中,当内存紧张时再回收,这样有个好处,当想再用它的时候,就不用再创建一个新的出来,这个就是我们常说的将对象缓存起来。很多系统的缓存功能都符合这样的应用场景。

强引用

Cat cat = new Cat()

我们可以看到等号的右边,创建了一个对象,该对象存储在堆中,而等号的左边是这个对象的引用,存储在栈中。而这种引用关系,就被称为强引用。

当 JVM 开始回收的时候,对于强引用,即使内存不足也不会回收被强引用的对象。因此强引用是造成 Java 内存泄漏的主要原因之一。

而如果我们显示地将强引用赋值为 null(比如 cat = null),则可以认为之前的对象会被垃圾收集器回收。

编写脚本

package com.test;public class TestStrongReference {public static void main(String[] args) {// 这样定义的默认就是强应用Object obj1 = new Object();// 使用第二个引用,指向刚刚创建的 Object 对象Object obj2 = obj1;// 将 obj1 引用设置为 nullobj1 = null;// 模拟 OOM 自动 GCtry {// 创建 20M 的大对象byte[] bytes = new byte[20 * 1024 * 1024];} catch (Exception e) {e.printStackTrace();} finally {System.out.println(obj1);System.out.println(obj2);}}
}

运行程序

$ java -Xms5m -Xmx5m -XX:+PrintGCDetails com.test.TestStrongReference
[GC (Allocation Failure) [PSYoungGen: 918K->496K(1536K)] 918K->740K(5632K), 0.0016865 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC (Allocation F

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/456902.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

聚焦网络安全公司,看F5如何应对企业数字化挑战

应用无处不在的当下,从传统应用到现代应用再到边缘、多云、多中心的安全防护,安全已成为企业数字化转型中的首要挑战。有专家指出,目前网络安全市场已经是仅次于计算、存储、网络的第四大IT基础设施市场。那什么网络安全公司应该具有哪些能力…

EMC防护

EMI是指电子设备在自身工作过程中产生的电磁波,对外发射并对设备其它部分或外部其它设备造成干扰。EMI测试项目包括电源线传导骚扰(CE)测试、信号、控制线传导骚扰(CE)测试、辐射骚扰(RE)测试、…

2.6两个线程实现同步代码示例

#include<myhead.h> //1、定义无名信号量 sem_t sem; //定义生产者线程 void *task1(void *arg) {int num 5;while(num--){sleep(1);printf("我生产了一辆飞机\n");//4、释放资源sem_post(&sem);}//退出线程pthread_exit(NULL); } //定义消费者线程 void …

macOS的设置与常用软件(含IntelliJ IDEA 2023.3.2 Ultimate安装,SIP的关闭与开启)

目录 1 系统设置1.1 触控板1.2 键盘 2 软件篇2.1 [科学上网](https://justmysocks5.net/members/)2.1 [安装Chrome浏览器](https://www.google.cn/chrome/index.html)2.2 [安装utools](https://www.u.tools)2.3 [安装搜狗输入法](https://shurufa.sogou.com/)2.4 [安装snipaste…

「AI Party」喊你来!百度Create大会4月16-17日在深圳举办

引领全球AI风潮的百度Create AI开发者大会&#xff0c;正式定档2024年4月16日至17日&#xff0c;将在深圳国际会展中心&#xff08;宝安&#xff09;举办。 百度Create大会是全球首个AI开发者大会&#xff0c;更是2024年科技圈最重要的活动之一。来自世界各地的数万名顶尖开发…

数据结构(C语言)代码实现(七)——一元多项式的表示与相加

目录 前言 参考资料格式 头文件LinkList.h LocateElem函数&#xff0c;定位查找 有序插入&#xff08;没测试&#xff09; 完整代码 头文件polynomial.h 测试函数&#xff08;主函数&#xff09; 测试结果 前言 寒假在家&#xff0c;有点学不下去&#xff0c;写文章的…

net start mysql服务名无效|发生系统错误 解决办法

未输入正确的mysql服务名 解决办法&#xff1a; 使用net start命令查看可用的服务名&#xff0c;找到mysql的服务名 未使用管理员身份运行命令提示符 解决方法&#xff1a; 使用管理员身份运行命令提示符

C# WPF GridControl数据汇总

概述 dev的GridControl自带数据汇总的功能&#xff0c;想对表格数据在底部做一个简单的统计&#xff0c;百度了一下找了很多个博客都没啥用&#xff0c;最终果断查看dev官网实现&#xff0c;官网地址&#xff1a; https://docs.devexpress.com/WPF/7354/controls-and-libraries…

唐嫣、刘诗诗、杨幂齐聚春晚舞台,再现仙剑三美惊艳绝伦的魅力。

♥ 为方便您进行讨论和分享&#xff0c;同时也为能带给您不一样的参与感。请您在阅读本文之前&#xff0c;点击一下“关注”&#xff0c;非常感谢您的支持&#xff01; 文 |猴哥聊娱乐 编 辑|徐 婷 校 对|侯欢庭 近日&#xff0c;娱乐圈的目光将聚焦于三位璀璨的女星——唐嫣…

NLP_神经概率语言模型(NPLM)

文章目录 NPLM的起源NPLM的实现1.构建实验语料库2.生成NPLM训练数据3.定义NPLM4.实例化NPLM5.训练NPLM6.用NPLM预测新词 NPLM小结 NPLM的起源 在NPLM之前&#xff0c;传统的语言模型主要依赖于最基本的N-Gram技术&#xff0c;通过统计词汇的共现频率来计算词汇组合的概率。然而…

C# WinForm开发系列 - DataGridView

原文地址&#xff1a;https://www.cnblogs.com/peterzb/archive/2009/05/29/1491891.html 1.DataGridView实现课程表 testcontrol.rar 2.DataGridView二维表头及单元格合并 DataGridView单元格合并和二维表头.rar myMultiColHeaderDgv.rar 3.DataGridView单元格显示GIF图片 …

深入探究:JSONCPP库的使用与原理解析

君子不器 &#x1f680;JsonCPP开源项目直达链接 文章目录 简介Json示例小结 JsoncppJson::Value序列化Json::Writer 类Json::FastWriter 类Json::StyledWriter 类Json::StreamWriter 类Json::StreamWriterBuilder 类示例 反序列化Json::Reader 类Json::CharReader 类Json::Ch…