垃圾回收<2>垃圾回收相关算法

  • 一.标记阶段: 引用计数算法
    • 对象存活判断
    • 方法一 : 引用计数算法
      • 循环引用
        • 例子
    • 小结
  • 二.标记阶段: 可达性分析算法
    • 方法二: 可达性分析(或搜索算法,追踪性垃圾收集)
    • GC Roots
    • 注意
  • 三.对象的finalization机制
    • 生存还是死亡
    • 具体过程
    • 示例
      • 第一次注释finalize()方法执行:
      • 第二次重写finalize()方法执行:
  • 四.MAT与JProfiler的GC Roots溯源
    • 获取dump文件
      • 方式1: 命令行使用jmap
      • 方式2: 使用JVisualVM导出
        • 导出方法
    • 示例
    • 在这里插入图片描述
  • 五.清除阶段: 标记-清除(Mark - Sweep)算法
    • 标记-清除(Mark - Sweep) 算法
  • 六.清除阶段: 复制(Copying)算法
    • 应用场景
  • 七.清除阶段: 标记-压缩(或标记-整理,Mark - Compact)算法
  • 八.小结
    • 对比三种算法
  • 九.分代收集算法
  • 十.增量收集算法,分区算法
    • 增量收集算法
    • 分区算法

一.标记阶段: 引用计数算法

对象存活判断

方法一 : 引用计数算法

循环引用

例子

使用-XX:+printGCDetails 打印GC详情, 进行了GC后,发现对象已经被清除了,证明java没有使用引用计数算法

可以查看堆内存的大小是使用了655k,可以将System.gc()去掉运行一遍,可以明显的发现内存变小了,对象被清除了

小结


二.标记阶段: 可达性分析算法

方法二: 可达性分析(或搜索算法,追踪性垃圾收集)



GC Roots



注意


三.对象的finalization机制

生存还是死亡

具体过程


示例

public class CanReliveObj {public static CanReliveObj obj;// 类变量,属于GC Root/*** 此方法只能被调用一次* @throws Throwable*/@Overrideprotected void finalize() throws Throwable {super.finalize();System.out.println("调用当前类重写的finalize()方法");obj = this; // 当前待回收的对象在finalize()方法中与引用链上的一个对象obj建立了联系}public static void main(String[] args) throws InterruptedException {obj = new CanReliveObj();// 对象第一次成功拯救自己obj = null;System.gc();// 调用垃圾回收器System.out.println("第一次 GC");// 因为Finalizer线程优先级很低,暂停两秒,等待它Thread.sleep(2000);if (obj == null) {System.out.println("obj is dead");} else {System.out.println("obj is still alive");}System.out.println("第二次 GC");// 下面这段代码和上面一样,但是这次自救失败了obj = null;System.gc();Thread.sleep(2000);if (obj == null) {System.out.println("obj is dead");} else {System.out.println("obj is still alive");}}
}

第一次注释finalize()方法执行:

第二次重写finalize()方法执行:


四.MAT与JProfiler的GC Roots溯源


获取dump文件

public class GCRootsTest {public static void main(String[] args) throws InterruptedException {List<Object> numList = new ArrayList<>();Date birth = new Date();for (int i = 0; i < 100; i++) {numList.add(String.valueOf(i));Thread.sleep(10);}System.out.println("数据添加完毕,请操作:  ");new Scanner(System.in).next();numList = null;birth = null;System.out.println("numList,birth 已置空,请操作: ");new Scanner(System.in).next();System.out.println("结束");}
}

方式1: 命令行使用jmap

jmap -dump:format=b,live,file=test1.bin 14036

方式2: 使用JVisualVM导出

导出方法

成勋启动之后,打开jvusualvm,如图不同时间段导出dump文件

然后使用MAT工具打开



可以看出 numList = null; birth = null;之后,这两个就从GCRoot中被移除了



可以进行溯源,查看具体那个对象在哪儿发生了内存泄漏,查看那个对象一直没有被GC处理

示例

五.清除阶段: 标记-清除(Mark - Sweep)算法

标记-清除(Mark - Sweep) 算法

注: 这里进行标记的是可达对象(非垃圾对象),不是标记的垃圾的,反而是垃圾对象的反面.可达对象


在创建对象的时候,在为对象分配内存空间的时候,如果论空间为不规整的话,这个时候就会进行空闲列表分配


六.清除阶段: 复制(Copying)算法


应用场景


七.清除阶段: 标记-压缩(或标记-整理,Mark - Compact)算法






八.小结

对比三种算法


九.分代收集算法




十.增量收集算法,分区算法

增量收集算法

分区算法

降低延迟的方式之一


JVM学习笔记(12) 垃圾回收-垃圾回收相关算法相关推荐

  1. 【JVM学习笔记】内存回收与内存回收算法 就哪些地方需要回收、什么时候回收、如何回收三个问题进行分析和说明

    目录 一.相关名词解释 垃圾收集常用名词 二.哪些地方需要回收 本地方法栈.虚拟机栈.程序计数器 方法区 Java堆 三.什么时候回收 1. 内存能否被回收 内存中的引用类型 引用计数算法 可达性分析 ...

  2. JVM学习(四):垃圾回收器

    JVM学习(四):垃圾回收器 前面我们学习了JVM的垃圾回收算法,如果说,垃圾回收算法是内存回收的理论,那么今天我们要讲的垃圾回收器,就是内存回收的具体实现了.在Java虚拟机规范中对垃圾回收器应该如 ...

  3. C++语言学习笔记15:Clean 垃圾清理插件

    C++语言学习笔记15:Clean 垃圾清理插件 对话框 STET1 图片切换功能 导入位图资源 插入图片控件并修改属性 添加消息处理函数 step2 开发思路及类关系图 step3 添加控件及MFC ...

  4. JVM学习笔记汇总:结合尚硅谷宋红康老师视频教程及PPT

    JVM学习笔记汇总:结合尚硅谷宋红康老师视频教程及PPT 第一章:JVM虚拟机的介绍 1.1虚拟机的分类 虚拟机通常分为两类:系统虚拟机和程序虚机.其中,系统虚拟机是指完全对物理计算机的仿真,而程序虚 ...

  5. JVM学习笔记(自用)

    JVM学习笔记(自用) 文章目录 JVM学习笔记(自用) 1.简介 2.程序计数器 3. 虚拟机栈 4. 方法区 5. 直接内存 6. 垃圾回收 Young Collection Young Coll ...

  6. JVM学习笔记之GUI监控工具

    目录 背景 jConsole 本地连接:连接本地计算机一个正在运行的JVM进程 远程连接:连接JMX代理 高级连接:使用特殊的URL连接JMX代理 VisualVM 插件安装 连接方式 本地连接:连接 ...

  7. JVM学习笔记(四)------内存调优

    首先需要注意的是在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提 ...

  8. JVM学习笔记(四)

    JVM学习笔记(四) 文章目录 JVM学习笔记(四) 笔记链接 1.GC算法 1.1GC-判断对象是否可回收 1.1.1 引用计数法 1.1.1 可达性分析 1.2GC-回收算法 标记清除法(Mark ...

  9. jvm学习笔记(三)

    jvm学习笔记(三) 文章目录 jvm学习笔记(三) 1.全部笔记链接 2.堆 2.1堆的划分 使用JVM参数查看划分 Hotspot堆内存划分图(JDK8之前) 2.2 GC对堆的回收 GC的种类 ...

  10. JVM学习笔记-02-JVM的体系结构

    JVM学习笔记-02-JVM的体系结构 文章目录 JVM学习笔记-02-JVM的体系结构 1. JVM的位置 2. JVM的体系结构 3.垃圾回收GC 4.JVM调优 视频链接-最新JVM教程IDEA ...

最新文章

  1. 导师:顶会论文3天都复现不出来?你退学吧!
  2. 磁共振检查头部能检测出什么_什么是磁共振血管造影?检查价格贵吗?
  3. Bags of Binary Words | 词袋模型解析
  4. VC中海量文件读写类设计与应用(转)
  5. 开源 免费 java CMS - FreeCMS2.1 菜单管理
  6. Apache的Access.log分析总结
  7. TomTom导航新增IFTTT功能 可连接到车主日常生活设备
  8. PAT (Basic Level) Practice1010 一元多项式求导
  9. 五分钟搭建 Flash 视频直播站
  10. ASP.NET Core 入门教程 7、ASP.NET Core MVC 分部视图入门
  11. CentOS/Ubuntu 14.10 安装 phpstorm
  12. D-S证据理论超简单理解
  13. 轩辕剑【超越XISE菜刀的shell管理工具】
  14. 三维扫描仪在工业生产中的作用
  15. 你知道大量群发邮件用什么邮箱好吗?
  16. boost - 智能指针介绍
  17. JQ实现谷歌小恐龙小游戏
  18. POJ 3265 Problem Solving
  19. SQL-44 将id=5以及emp_no=10001的行数据替换成id=5以及emp_no=10005,其他数据保持不变,使用replace实现。...
  20. XML编程经验――LIBXML2库使用指南

热门文章

  1. 欧几里得几何(1)Alpha
  2. 各大型网站架构分析收集 1
  3. HJ82 将真分数分解为埃及分数(需要知道求埃及数的数学方法)
  4. 【marked is not a function】解决百度脑图“kityminder”备注报错
  5. Java小程序--多彩时钟表盘的制作
  6. Win10 设置默认语言
  7. websocket+kafka+springcloud+springboot实现报文(json)传输,解析,推送
  8. 【为人处事】:如何识人
  9. BZOJ3772精神污染
  10. Unity笔记之动画遮罩