JVM学习笔记(12) 垃圾回收-垃圾回收相关算法
垃圾回收<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) 垃圾回收-垃圾回收相关算法相关推荐
- 【JVM学习笔记】内存回收与内存回收算法 就哪些地方需要回收、什么时候回收、如何回收三个问题进行分析和说明
目录 一.相关名词解释 垃圾收集常用名词 二.哪些地方需要回收 本地方法栈.虚拟机栈.程序计数器 方法区 Java堆 三.什么时候回收 1. 内存能否被回收 内存中的引用类型 引用计数算法 可达性分析 ...
- JVM学习(四):垃圾回收器
JVM学习(四):垃圾回收器 前面我们学习了JVM的垃圾回收算法,如果说,垃圾回收算法是内存回收的理论,那么今天我们要讲的垃圾回收器,就是内存回收的具体实现了.在Java虚拟机规范中对垃圾回收器应该如 ...
- C++语言学习笔记15:Clean 垃圾清理插件
C++语言学习笔记15:Clean 垃圾清理插件 对话框 STET1 图片切换功能 导入位图资源 插入图片控件并修改属性 添加消息处理函数 step2 开发思路及类关系图 step3 添加控件及MFC ...
- JVM学习笔记汇总:结合尚硅谷宋红康老师视频教程及PPT
JVM学习笔记汇总:结合尚硅谷宋红康老师视频教程及PPT 第一章:JVM虚拟机的介绍 1.1虚拟机的分类 虚拟机通常分为两类:系统虚拟机和程序虚机.其中,系统虚拟机是指完全对物理计算机的仿真,而程序虚 ...
- JVM学习笔记(自用)
JVM学习笔记(自用) 文章目录 JVM学习笔记(自用) 1.简介 2.程序计数器 3. 虚拟机栈 4. 方法区 5. 直接内存 6. 垃圾回收 Young Collection Young Coll ...
- JVM学习笔记之GUI监控工具
目录 背景 jConsole 本地连接:连接本地计算机一个正在运行的JVM进程 远程连接:连接JMX代理 高级连接:使用特殊的URL连接JMX代理 VisualVM 插件安装 连接方式 本地连接:连接 ...
- JVM学习笔记(四)------内存调优
首先需要注意的是在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提 ...
- JVM学习笔记(四)
JVM学习笔记(四) 文章目录 JVM学习笔记(四) 笔记链接 1.GC算法 1.1GC-判断对象是否可回收 1.1.1 引用计数法 1.1.1 可达性分析 1.2GC-回收算法 标记清除法(Mark ...
- jvm学习笔记(三)
jvm学习笔记(三) 文章目录 jvm学习笔记(三) 1.全部笔记链接 2.堆 2.1堆的划分 使用JVM参数查看划分 Hotspot堆内存划分图(JDK8之前) 2.2 GC对堆的回收 GC的种类 ...
- JVM学习笔记-02-JVM的体系结构
JVM学习笔记-02-JVM的体系结构 文章目录 JVM学习笔记-02-JVM的体系结构 1. JVM的位置 2. JVM的体系结构 3.垃圾回收GC 4.JVM调优 视频链接-最新JVM教程IDEA ...
最新文章
- 导师:顶会论文3天都复现不出来?你退学吧!
- 磁共振检查头部能检测出什么_什么是磁共振血管造影?检查价格贵吗?
- Bags of Binary Words | 词袋模型解析
- VC中海量文件读写类设计与应用(转)
- 开源 免费 java CMS - FreeCMS2.1 菜单管理
- Apache的Access.log分析总结
- TomTom导航新增IFTTT功能 可连接到车主日常生活设备
- PAT (Basic Level) Practice1010 一元多项式求导
- 五分钟搭建 Flash 视频直播站
- ASP.NET Core 入门教程 7、ASP.NET Core MVC 分部视图入门
- CentOS/Ubuntu 14.10 安装 phpstorm
- D-S证据理论超简单理解
- 轩辕剑【超越XISE菜刀的shell管理工具】
- 三维扫描仪在工业生产中的作用
- 你知道大量群发邮件用什么邮箱好吗?
- boost - 智能指针介绍
- JQ实现谷歌小恐龙小游戏
- POJ 3265 Problem Solving
- SQL-44 将id=5以及emp_no=10001的行数据替换成id=5以及emp_no=10005,其他数据保持不变,使用replace实现。...
- XML编程经验――LIBXML2库使用指南