文章目录
1.垃圾回收概述
1.1 什么是垃圾
1.2 为什么需要GC
1.3 Java垃圾回收机制
2. 垃圾回收算法
2.1 垃圾标记算法
2.1.1 引用计数法
因为JVM没有使用使用引用计数法所以obj1和obj2都不能回收
2.1.2 可达性分析算法
对象的finalization机制
该方法十分鸡肋,工作中几乎用不到。
MAT与JProfiler的GC Roots溯源
MAT
MAT是Memory Analyzer的简称,它是一款功能强大的Java堆内存分析器。用于查找内存泄漏以及查看内存消耗情况。
MAT是基于Eclipse开发的,是一款免费的性能分析工具
public class GCRootsTest {
public static void main(String[] args) {
List<Object> numList = new ArrayList<>();
Date birth = new Date();
for (int i = 0; i < 100; i++) {
numList.add(String.valueOf(i));
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
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("结束");
}
}
生成堆dump文件
jmap -dump:format=b,file=C:\Users\qinshuoyu\Desktop\1.hprof.analysis\log\1.hprof 19420
numList、birth置空前,GC ROOTS中有ArrayList对象和Date对象
numList、birth置空后,GC ROOTS中已经没有ArrayList对象和Date对象了
MAT中GC ROOTS分类与之前所讲略有不同,只要分为系统类、JNI Global、线程、监视器
JProfiler
2.2 标记-清除算法原理及优缺点
垃圾清除阶段
标记的是可达的对象,因为从GC ROOTS出发只能关联到可达对象。
2.3 复制算法
特别适合垃圾对象很多,存活对象很少的场景;例如:Young区的S0区和S1区
2.4 标记压缩(标记整理)
2.5 增量收集算法、分区算法
注:本文是学习 尚硅谷宋红康JVM全套教程(详解java虚拟机)所做笔记。