Java虚拟机(JVM)的学习笔记——垃圾回收机制

判断对象存活: 可达性分析(python使用的是引用记数法)
可达性分析:只要你与GC roots有链式关联,则表示对象是存活状态

 

新生代(eden、from、to)
复制回收算法
由于大部分对象都会被回收,因此eden、from、to的空间比例为8:1:1
当eden区进行垃圾回收的时候,存活下来的对象复制进入from区或者to区,其余对象则全部清空
from与to区,存活下来的对象复制进入另一个区,该区之间清空,数据在哪个区,由eden区进来的对象就在哪个区
因此from区或者to区会有一个区一直处于空的状态,对象经过一个区域,对象头的age属性就会+1,默认age超过15时进入老年代
当对象太大,导致from区或者to区提前占满,且没有对象的age超过15,则会进行动态对象年龄判断,让部分数据提前进入老年代

空间利用率大,速度快,会产生内存碎片

 

老年代
CMS 标记清除算法

暂停用户线程,所有线程执行GC操作标记(本次标记只标记与GC roots直接关联的数据,因此速度非常快,但影响用户线程执行)
|
|
|
开启用户线程,单独开一条线程给GC,进行对象标记(本次标记所有与步骤1标记相关联的数据,单线程执行,数据多,速度慢,但不影响用户线程执行)
|
|
|
暂停用户线程,所有线程执行GC操作标记(本次标记的是步骤2执行期间用户线程产生的新的垃圾,非常快,但影响用户线程执行)
|
|
|
开启用户线程,单独开一条线程给GC,进行垃圾清理(速度慢,但不影响用户线程执行)
|
|
|
执行完毕,把线程还给用户线程

影响用户部分时间较短;
会产生浮动垃圾(垃圾清理不干净,因为在清理垃圾的时候用户线程同时在执行,只能等下次GC工作的时候才清理掉);
会产生内存碎片;

posted @ 2020-11-22 12:10  金大人的梦  阅读(75)  评论(0编辑  收藏  举报