JVM学习笔记之了解对象存活判断和4种引用【三】

垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还”存活”着,哪些已经”死去”

一、对象存活判断

1.1 引用计数算法(Reference Counting)

工作原理

  • 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加 1;当引用失效时,计数器值就减 1;任何时候计数器为 0 的对象是不可能再被使用的。

分析 Java虚拟机 是否采用该算法

  • 代码
/**
 * JVM  args :-XX:+PrintGCDetails 通过此命令可以打印GC信息
 * 引用计数GC:
 */
public class ReferenceCountingGC {
    private Object instance=null;

    public static final int _1M=1024*1024;

    private byte[] bytes=new byte[2*_1M];

    public static void testGC(){
        ReferenceCountingGC rA = new ReferenceCountingGC();
        ReferenceCountingGC rB = new ReferenceCountingGC();

        rA.instance = rB;
        rB.instance = rA;

        rA=null;
        rB=null;

        //手动发生GC
        System.gc();
    }
    public static void main(String[] args) {
        testGC();
    }
}
  • 输出

JVM学习笔记之了解对象存活判断和4种引用【三】

上面例子 rA 与 rB 互相依赖,从结果来看,内存大小从 7462k -> 784k,虚拟机进行了回收,证明虚拟机不是通过引用计数法来判断对象存活的。

1.2 可达性分析算法(Reachability Analysis)

工作原理

  • 通过一系列的成为”GC Roots” 的对象作为起点,从这些节点开始向下搜索,搜索走过的路径成为引用链(Reference Chain),当一个对象到 GC Roots 没有任何 GC 引用链连接时(从 GC Roots 到这个对象不可达)则证明这个对象是不可活的。

图示:

JVM学习笔记之了解对象存活判断和4种引用【三】

GC Roots 的对象包括下面几种

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

二、Java 四种引用

经过上面描述得知,对象的存活都与”引用”有关。在 JDK1.2 之后,Java 对引用的概念进行了扩充,将引用分为强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Week Reference)、虚引用(Phantom Reference),引用强度依次减弱。

强引用 > 软引用 > 弱引用 > 虚引用

2.1强引用

是使用最普遍的引用,类似”Object obj = new Object()”。只要强引用还存在,垃圾收集器就不会回收被引用的对象

2.2软引用

描述一些还有用但并非必须的对象。在系统将要发生内存溢出之前,将会把这些对象列进回收范围之中进行二次回收。如果这次回收还没有足够的内存,才会抛出内存溢出异常。

2.3弱引用

描述非必须对象,强度比软引用还弱一些。被弱引用关联的对象只能生存到下次垃圾收集之前。当垃圾收集器工作时,无论当内存是否足够,都会回收掉只被弱引用关联的对象。

2.4虚引用

一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来获得一个对象实例。为一个对象设置虚引用关联的唯一目的就是在这个对象被收集回收时收到一个系统通知。

2.5总结

引用类型 GC 时 JVM 内存充足 GC 时 JVM 内存不足 应用场景 强引用 不被回收 不被回收 弱引用 被回收 被回收 软引用 不被回收 被回收 软引用通常用于实现内存敏感缓存 虚引用 被回收 被回收 大多被用于引用销毁前的处理工作

参考

  • 《深入理解 Java 虚拟机:JVM 高级特性与最佳实践(第 3 版)》

Original: https://www.cnblogs.com/JianJianHuang/p/14125165.html
Author: JiaJianHuang
Title: JVM学习笔记之了解对象存活判断和4种引用【三】

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/573086/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • mybatis-plus自定义代码模板

    http://www.manongjc.com/article/47597.html Original: https://www.cnblogs.com/tszr/p/165167…

    Java 2023年5月30日
    0105
  • 手把手教你写一个SpringMVC框架

    一、介绍 在日常的 web 开发中,熟悉 java 的同学一定知道,Spring MVC 可以说是目前最流行的框架,之所以如此的流行,原因很简单: 编程简洁、上手简单! 我记得刚开…

    Java 2023年6月9日
    078
  • MySql数据库备份与还原

    备份(mysqldump) 实现功能: 1、备份指定的数据库 2、删除指定天数前的备份文件,默认设定了1天 脚本示例(mysql_bak.sh) 数&…

    Java 2023年6月8日
    095
  • 互联网技术部门该如何管理

    一、敏捷开发 1.快速开发、快速迭代。 2.组件式开发,避免重复造轮子。 3.制定代码标准。 4.并行开发,高效配合。 5.单元测试必须覆盖所有核心业务。 二、DevOps流程建立…

    Java 2023年6月16日
    091
  • 力扣刷题3-14. 最长公共前缀

    最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “”。 示例 1: 输入:strs = [“fl…

    Java 2023年6月13日
    079
  • Java面向对象编程思维导图

    Java面向对象编程知识点思维导图 Java面向对象编程思维导图 posted @2022-04-15 21:10 哆啦L 阅读(48 ) 评论() 编辑 Original: ht…

    Java 2023年6月5日
    088
  • 在web.xml配置springmvc过滤器解决乱码

    代码: <!–配置过滤器–> <filter> <filter-name>characterEncodingFilter</filte…

    Java 2023年6月9日
    060
  • HTML基础

    layui:https://www.layui.com/bootstrap:https://v3.bootcss.com/ HTML基础 <sup></sup&g…

    Java 2023年6月13日
    0106
  • Git rebase 合并多次提交

    在一般研发管理流程中,我们一般都是这么使用Git版本的: 0、先拿到一个需求(不细谈需求前面的采集、归纳整理、确认及评审等环节) 1、从主分支checkout一个新分支 2、在完成…

    Java 2023年6月6日
    076
  • xmind指定32位jdk解决在64位系统上不能启动的问题

    在xmind.ini文件的第一行添加下面的内容: -vmF:\kfgj\Java32.1.6\jdk1.6.0_16\bin\javaw.exe (根据实际情况指定32位jdk的j…

    Java 2023年5月30日
    066
  • Mysql索引-B+树

    分享概要 本次分享儒猿专栏 《从零开始带你成为 MySQL 实战优化高手》中Mysql索引的内容。本次会先从一个数据页中如何存储和查询数据开始,拓展到多个数据页中查询数据,分析无索…

    Java 2023年6月8日
    084
  • JavaScript详解

    一、快速入门 1.JavaScript的两种引入方式 方式一:直接在html里面写 目的:实现简单的弹窗 点击查看代码 <!DOCTYPE html> <html…

    Java 2023年6月13日
    075
  • Nginx_Windos本地部署

    安装跟配置 安装: 下载地址:nginx: download 下载完成后,在指定位置解压缩,不要直接双击nginx.exe。 配置: server { listen 10700; …

    Java 2023年5月30日
    094
  • IDEA SpringBoot多模块项目搭建详细过程(转)

    文章转自https://blog.csdn.net/zcf980/article/details/83040029 项目源码: 链接: https://pan.baidu.com/…

    Java 2023年5月29日
    0139
  • 5.2.SpringBoot整合Kafka(开整)

    1、准备工作 pom配置: <dependency> <groupid>org.springframework.kafka</groupid> …

    Java 2023年6月9日
    091
  • IDEA开启并配置services窗口

    services窗口是一个管理所有服务的地方 开启方法:1.点击菜单栏:Views -> Tool Windows -> Services;或者使用快捷键Alt + F…

    Java 2023年6月7日
    090
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球