JVM之-----堆

堆内存是用来存储对象的,堆内存分为三个区:Eden区,Survivor区,老年代.

1.内存分布:
年轻代包括Eden区和Survivor区,占整个堆内存的1/3;
老年代占2/3;
其中Eden区占年轻代的8/10,Survivor区中的Survivor 01(Form) 占年轻代的1/10,Survivor区中的Survivor 02(To)占年轻代的1/10;

2.可达性分析算法:
在这里插入图片描述
3.分代年龄:
字节码执行引擎每开启一次minor GC(Garbage Collection),存活的对象分代年龄+1,当分代年龄为15的对象还在存活,将此对象放到老年代.

4.堆内存处理过程:
在这里插入图片描述

对象最开始存放在Eden区,当Eden区存满之后,JVM中的字节码执行引擎开启minor GC(Garbage Collection),此时停止所有用户线程(STW—Stop The World),利用可达性分析算法,将仍然存活的对象放到Survivor 01中,其余Eden区的对象进行回收;
此时Eden区为空,继续开始存放对象,当再次Eden区存满时,JVM中的字节码执行引擎开启minor GC(Garbage Collection),此时停止所有用户线程(STW—Stop The World),利用可达性分析算法,将Eden区和Survivor 01中仍然存活的对象放到Survivor 02中,其余Eden区和Survior 01的对象进行回收;
如此循环…
当老年代的内存存满了(OOM),JVM中的字节码执行引擎开启full GC(Garbage Collection),此时停止所有用户线程(STW—Stop The World),利用可达性分析算法,将整个堆内存(老年代和年轻代)的垃圾回收.

5.为什么执行GC线程时,要停止用户所有线程(STW)?
其他线程在执行的时候可能会改变对象的引用状态,比如在进行标记的时候已经被标记为可回收的对象可能被再次引用,就会造成回收了不能被回收的对象而出现问题.在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_45660875/article/details/109259200
今日推荐