JVM垃圾回收机制

一、确定垃圾对象的方法
1、计数法。缺点:无法解决循环引用的问题。
2、可达性分析算法。java采用的是这种算法。根节点:线程栈的中变量,静态变量和本地方法栈(native修饰的方法)的中变量。

二、垃圾回收算法
1、Mark-sweep(标记清除),只是吧垃圾处理,会产生碎片,效率高。


2、Coping(复制算法),吧内存分成2份,清理后,吧可用的对象复制到另一半内存中,内存利用率低。


3、Mark-compact(标记整理),把垃圾清理以后,吧内存重新整理,效率低,没有碎片。



三、常用的垃圾收集器 共10种
分代模型:java8及之前的版本,有6种,其中1、2、3用于年轻代,4、5、6用于老年代
1、ParNew    Parallel Scavenge的优化版本
2、Serial 单线程,新生代采用复制算法
3、Parallel Scavenge 多线程的Serial,新生代采用复制算法,jdk1.8默认收集器
4、CMS
5、Serial Old 单线程,老年代采用标记整理算法。
6、Parallel Old 多线程的Serial Old,老年代采用标记整理算法,jdk1.8默认收集器

 

 

 



分区模型:java9及以后共4种
1、G1
2、ZGC
3、Epsilon
4、G1的增强版



三、java虚拟机分为三部分


1、类装载系统
2、执行引擎
3、运行时数据区(内存模型)
a、堆(垃圾回收优化的地方)


堆内存分为:
Eden(伊甸园区)(8/10的空间) ,可达性分析算法,找出非垃圾,剩下的就是垃圾,这儿产生的垃圾回收叫YGC;
未被回收的对象,被复制到Servivor区。用复制算法。
Survivor(幸存区)(共2个,每个占1/10的空间,共占2/10的空间),大对象和年龄超过15的存活对象,被复制到老年代。
Old(老年区)占2/3的空间,老年代的垃圾收集算法,标记整理或标记清除(不同的垃圾收集器,算法不同)。
b、线程栈
c、本地方法栈
d、方法区(元空间)
e、程序计数器
其中堆和方法区是线程共享数据,其余三种是线程私有的。

原文地址:https://www.cnblogs.com/rana4504/p/14595090.html