JVM垃圾判定算法

news2024/11/22 21:04:55

垃圾收集技术是Java的一堵高墙。Java堆内存中存放着几乎所有的对象实例,垃圾收集器在对堆内存进行回收前,第一件事情就是要确定这些对象中哪些还存活,哪些已经死去(即不可能再被任何途径使用的对象)。也就是判定垃圾。通常有两种方法:

引用计数法

引用计数法(Reference Counting)的算法是:给每个对象添加一个引用计数器,有一个引用,计数器值加1;当引用失效,计数器值减1;任何时刻计数器值为0的对象就是不可能再被使用的。
这种方法实现简单,判定效率也很高,但有个问题:它很难解决对象之间相互循环引用的问题。

package org.hbin.gc;

/**
 * VM args: -XX:+PrintGC -XX:+PrintGCDetails
 * @author Haley
 * @version 1.0
 * 2024/9/1
 */
public class ReferenceCountingGC {
    private Object instance;
    private byte[] array = new byte[1024 * 1024 * 5];

    public static void main(String[] args) {
        ReferenceCountingGC a = new ReferenceCountingGC();
        ReferenceCountingGC b = new ReferenceCountingGC();
        a.instance = b;
        b.instance = a;

        a = null;
        b = null;
        System.gc();
    }
}

运行上述代码,并打印GC日志:

[GC (System.gc())  12918K->616K(125952K), 0.0010921 secs]
[Full GC (System.gc())  616K->459K(125952K), 0.0097270 secs]

从运行结果可以看到,GC日志中包含12918K->616K,说明并没有因为这两个对象互相引用而不回收,也从侧面说明虚拟机并不是通过引用计数法来判断垃圾的。

根可达性分析算法

根可达性分析算法的基本思路:通过一系列称为GC Roots的对象作为起始点,从这些节点开始向下搜索,搜索路径称为引用链(Reference Chain)。当一个对象到GC Roots没有任何引用链相连(图论:从GC Roots到这个对象不可达)时,则证明此对象是不可用的。
在这里插入图片描述
在Java中,可作为GC Roots的对象包括:

  • 虚拟机栈(栈帧中的局部变量表)中引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈中JNI(即native方法)引用的对象

引用分类

在JDK1.2之前,引用的定义是:如果reference类型的数据中存储的数值代表的是另外一块内存的起始地址,就称这块内存代表着一个引用。
JDK1.2之后,Java对引用的概念进行了扩充,将引用分为四种:强引用、软引用、弱引用、虚引用,这四种引用强度依次逐渐减弱。

  • 强引用:Strong Reference,代码中普遍存在的,类似Object obj = new Object()这类的引用。只要引用还存在,垃圾收集器永远不会回收掉这些对象。
  • 软引用:Soft Reference,用来描述一些还有用但非必需的对象。在系统将要发生内存溢出之前,将会把这些对象列进回收范围之中进行二次回收。如果这次回收还不骨足够的内存,才会抛出内存溢出异常。相关Java类:SoftReference
  • 弱引用:Weak Reference,也用来描述非必需对象,但它的强度比软引用更弱一些。当垃圾回收器工作时,无论当前内存是否足够,都会回收掉弱引用关联的对象。相关Java类:WeakReference。
  • 虚引用:也称幽灵引用或幻影引用,它是最弱的一种引用关系。虚引用不影响对象的生成时间,也无法通过虚引用来取得一个对象实例。设置虚引用的唯一目的是能在这个对象被垃圾回收器回收时收到一个系统通知。相关Java类:PhantomReference。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32 使用8720 通过LWIP发送数据

一、硬件IOC 1、GPIO 2、NVIC 3、SYS 4、RCC 5、ETH 6、USART 7、LWIP 二、软件函数 1、Main /* USER CODE BEGIN Includes */ #include "ytcesys.h" /* USER CODE END Includes *//* USER CODE BEGIN 2 */ ethreset(); MX_LWIP_Init(); OPEN_USART1…

chunqiude

CVE-2022-28512 靶标介绍: Fantastic Blog (CMS)是一个绝对出色的博客/文章网络内容管理系统。它使您可以轻松地管理您的网站或博客,它为您提供了广泛的功能来定制您的博客以满足您的需求。它具有强大的功能,您无需接触任何代码即可启动并运…

【Java开发】Maven安装配置详细教程

原创文章,不得转载。 文章目录 产生背景用途安装配置本地仓库配置镜像 产生背景 在Java应用程序开发中,随着项目规模的不断扩大和复杂性增加,项目依赖的库、插件和配置文件也变得愈加复杂。传统的项目构建工具(如Ant)…

简单选择排序例题

从上面题目看出,如果排序方法可保证在排序前后排序码相同的相对位置不变,也就是四个选项里,21和21*之间不会交换 简单选择排序方法是:首先在所有记录中找到排序吗最小的记录,把它与第一个记录交换,然后在其…

EXO:模型最终验证的地方;infer_tensor;step;MLXDynamicShardInferenceEngine

目录 EXO:模型最终验证的地方 EXO:infer_tensor EXO:step MXNet的 mx.array 类型是什么 NDArray优化了什么 1. 异步计算和内存优化 2. 高效的数学和线性代数运算 3. 稀疏数据支持 4. 自动化求导 举例说明 EXO:模型最终验证的地方 EXO:infer_tensor 这段代码定…

【科技前沿】用深度强化学习优化电网,让电力调度更聪明!

Hey小伙伴们,今天我要跟大家分享一个超级酷炫的技术应用——深度强化学习在电网优化中的典型案例!如果你对机器学习感兴趣,或是正寻找如何用AI技术解决实际问题的方法,这篇分享绝对不容错过!👩‍&#x1f4…

Pyqt5高级技巧2:Tab顺序、伙伴快捷键、各类常用控件的事件、可移动的卡片式布局(含基础Demo)

目录 一、编辑Tab顺序 二、编辑伙伴 三、设置快捷键(仅MainWindow可用) 四、信号槽 【基本介绍】 【常用信号槽】控件对窗体(拖地) 【常用信号槽】控件对控件 【自定义信号槽】步骤 五、设计文件的转化 六、GUI的运行 1…

【研发日记】吃透新能源充电协议(一)——GB27930实例报文解析

文章目录 前言 背景介绍 充电协议框架 充电握手阶段 充电准备阶段 充电传输阶段 充电结束阶段 错误处理阶段 总结 参考资料 前言 近期在一个嵌入式开发项目中,用到了新能源充电协议,期间在翻阅各种资料文件时,一些地方还是容易理解…

包装和类练习 Stack的使用

目录 1.最小栈 2.有效的括号 3.栈的压入、弹出序列 4.逆波兰表达式求值 5.链栈与顺序栈相比&#xff0c;比较明显的优点是&#xff08; &#xff09; 1.最小栈 2.有效的括号 class Solution {public boolean isValid(String s) {Stack<Character> st new Stack<&g…

I/O方式

目录 一、程序查询方式 1.程序查询方式的特点 2.程序查询方式可分类 ①独占查询 ②定时查询 二、中断方式 1.中断I/O流程 2.例题 三、DMA方式 1.DMA控制器 2.特点 3. DMA的传送方式 ①停止CPU ②周期挪用 ③DMA和CPU交替访存 4.传送流程 ①预处理 ②数据传…

AIGC时代算法工程师的面试秘籍(第二十一式2024.8.19-9.1) |【三年面试五年模拟】

写在前面 【三年面试五年模拟】旨在整理&挖掘AI算法工程师在实习/校招/社招时所需的干货知识点与面试经验&#xff0c;力求让读者在获得心仪offer的同时&#xff0c;增强技术基本面。也欢迎大家提出宝贵的优化建议&#xff0c;一起交流学习&#x1f4aa; 欢迎大家关注Rocky…

海外云服务器安装 JDK8 (Ubuntu 18.04 记录篇)

本文首发于 秋码记录 曾几何时&#xff0c;我可是国内云厂商的忠实用户啊。 而今&#xff0c;却不再为云服务器&#xff08;尤指国内云厂商&#xff09;续费了&#xff0c;作为我的个人网站 秋码记录 选择了托管在 gitlab.com Pages服务上。 国内云厂商对新老用户持有两种截…

Linux网络编程入门及OSI七层模型

目录 OSI七层模型 TCP/IP五层(或四层)模型 ​编辑 协议报头 局域网 以太网 令牌环网 无线LAN OSI七层模型 TCP/IP五层(或四层)模型 物理层: 负责光/电信号的传递方式. 比如现在以太网通用的网线(双绞 线)、早期以太网采用的的同轴电缆 (现在主要用于有线电视)、光纤, 现…

全能型AI与专业型AI:未来的选择与挑战

引言 随着人工智能技术的飞速发展&#xff0c;市场上出现了多种类型的AI产品&#xff0c;其中全能型AI与专业型AI是两大主要类别。近期&#xff0c;OpenAI预计推出的代号为“草莓”的新AI引起了广泛关注&#xff0c;这一全能型AI的推出引发了关于未来AI趋势的热烈讨论。在这个…

学会自定义LayoutManager

最开始我在学习自定义LayoutManager的时候&#xff0c;也是网上搜文章&#xff0c;看博客&#xff0c;以及一些公众号的推文。刚开始看的时候觉得还是那么回事&#xff0c;但是在慢慢的深入LayoutManager源码才发现很多的文章其实都是不合格&#xff0c;乃至可以说是很误导人的…

vue3+elementplus的表格展示和分页实战

文章目录 一、Element Plus的安装使用二、el-table 表格组件三、el-pagination 分页组件四、全部代码五、效果 Element Plus 是一个基于 Vue 3 的现代化 UI 组件库&#xff0c;旨在帮助开发者快速构建美观且功能丰富的 Web 应用程序。它提供了大量的 UI 组件&#xff0c;如按钮…

leetcode3 无重复字符的最长子串

思路 双指针 易错点 什么时候更新长度 除了每次有重复的要更新 &#xff0c;如果abc这种&#xff0c;本身就不会重复&#xff0c;那maxLength就永远不会更新了。 思路不对 left不应该是1&#xff0c;对于abca&#xff0c;是1 对于 abcc,应该直接加3&#xff0c;所以需要记…

Python 从入门到实战4(序列的操作)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们通过举例学习了python 中列表的简单操作&#xff0c;…

Codeforces Round 107 (Div. 1) A. Win or Freeze (博弈论 + 数论*1400)

如果一个数是质数或者是1&#xff0c;那么一定是先手获胜&#xff0c;因为不能操作。 我们知道&#xff0c;一个数一定可以由 p 1 k 1 ∗ p 2 k 2 ∗ p 3 k 3 … p_{1}^{k_1}*p_{2}^{k_2}*p_3^{k_3}\dots p1k1​​∗p2k2​​∗p3k3​​…来唯一表示&#xff0c;那么我们就可以…

从入门到精通:掌握 CMD 与 PowerShell 之间的秘密

在日常使用 Windows 系统时&#xff0c;很多人都习惯于打开 CMD&#xff08;命令提示符&#xff09;来执行各种操作&#xff0c;从简单的文件管理到复杂的脚本编写&#xff0c;CMD 作为一个经典的工具确实陪伴我们走过了漫长的岁月。然而&#xff0c;随着系统管理需求的提升和自…