垃圾回收区域:

垃圾定位算法:
1.引用计数法;栈中有几个引用指向堆中的对象,则此对象计数为几。但是这种无法解决循环依赖的问题,故基本上不采用此方法
2.可达性分析算法:根据GC roots对象作为起点,向下搜索到的引用的对象,都属于非垃圾对象,其余都是垃圾对象。
GC roots:虚拟机栈(栈帧中的本地变量表)中引用的对象;方法区中类静态属性引用的对象;方法区中常量引用的对象;本地方法栈中JNI(即一般说的Native方法)引用的对象。(引自《深入java虚拟机》)
在老年代中(又称永久代,hotSpot的方法区),类需要同时满足下面3个条件才能算是“无用的类”:
- 该类所有的实例都已经被回收,也就是Java堆中不存在该类的任何实例。
- 加载该类的ClassLoader(类加载器)已经被回收。
- 该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。
垃圾回收算法:
1.标记-清除算法:Mark-sweep
优点:快
缺点:内存碎片化
2.标记-整理算法 Mark-compact
优点:内存有序
缺点:慢
3.复制算法: copying
优点:没有碎片内存
缺点:浪费空间
常用垃圾收集器
jdk1.8及之前:分代模型 jdk1.9及之后:分区模型

分代模型:
|
老年代收集算法 |
是否并发收集 |
是否发生STW |
备注 | |
|
Serial & Serial Old |
标记-整理 |
否 |
是 | |
|
Parallel Scavenge & Parallel Old |
标记-整理 |
是 |
是 | |
|
ParNew & CMS(ConcurrentMarkSweep ) |
标记-清除 |
是 |
视步骤而定 |
步骤: 初始标记(STW)-> 并发标记-> 重新标记(STW)-> 并发清理 |
注:
- CMS在并发清理时,此时用户线程是可执行,若此时老年代内存已满,则会发生错误,所以会采用serial-Old作为备用方案;
- CMS之所以会有三次标记,是因为并发标记时,用户线程可执行,此时的垃圾对象是不准确的,有漏标和浮动垃圾;
本文介绍了Java垃圾回收的基本原理,包括引用计数法和可达性分析算法,并详细阐述了老年代中无用类的判断标准。同时,讨论了三种垃圾回收算法:标记-清除、标记-整理和复制算法,及其优缺点。对于垃圾收集器,提到了Serial、ParallelScavenge、ParNew和CMS等,特别强调了CMS的并发标记过程和可能出现的问题。最后,简要说明了分代模型与分区模型在垃圾回收策略上的区别。

被折叠的 条评论
为什么被折叠?



