JVM内存、GC相关解读

JVM内存分为5个区域:

1.栈:函数当前运行中的临时变量(引用地址),线程执行完毕内容清空;
2.本地方法栈:存储c++的native方法等运行数据;
3.程序计数器:指向程序当前运行的位置;
4.堆:主要存储对象,包含老年代、年轻代,年轻代分为eden区、s0、s1三部分,三部分的空间比例为8:1:1。
5.方法区(元空间):静态方法、变量(static)、类信息、类加载器(classloader)等全局数据信息;

image

注:栈、本地方法栈、程序计数器为线程私有。

GC相关:
引用计数器(python)、可达性分析(JVM),可达性分析有STW。
串行执行:垃圾回收器执行的时候应用程序挂起,垃圾回收器有且只有一个后台线程执行垃圾对象的识别和回收;
并行执行:垃圾回收器执行的时候应用程序挂起,但是暂停期间会有多个线程进行识别和回收,可以减少垃圾回收时间;
并发执行:垃圾回收器执行期间,应用程序不用挂起正常运行(当然在某些必要的情况下垃圾回收器还是需要挂起的)

GC算法:
1.标记-清除:GCRoot扫描出未被引用的内存,进行标记,标记后删除。效率高但会产生内存碎片。
2.标记-压缩:清除后,将空出的内存进行整理。内存的可用性高,但整理的开销大。
3.标记-复制:将内存一分为二,进行GC时,将未被标记的内容复制到另一下·区域,进行紧凑存储,同时清除该区域内容。缺点:需要2倍的内存。
4.分代算法:分年轻代和老年代的GC,一般15次(通过参数-XX:MaxTenuringThreshold 配置)后移入老年代。减小了GC的作用范围。
5.增量算法:通过并发的方式,使应用程序与GC线程交替执行,降低了stw的时间。
6.并发算法:并发标记、并发转移、并发重定位。

内存管理模型:
f83a4614f771a40e84d8341080869236_compress

垃圾回收器:

76e5a359a27ab7d894c4d2af657d45cb_compress

08437b5952a7ea2ae29df3fcc2152fb3_compress

22b883c20b361b37f9607ad73968dc53_compress

jdk1.8默认使用ps+po

jdk1.9开始默认G1

CMS:

三色标记算法:未被识别过的对象一种颜色(白)、尚未完全识别到全部子对象的一种颜色(灰),完成识别的一种颜色(黑)。

68b323d591cec1891dd93ee97d28b626_compress

该方式在重新标记处,产生长时间stw。

对于产生的表示后业务线程对对象引用的改变,优化三色标记,是发现完成标识后又有新的引用,会将黑色变为灰色重新标识。

G1:三色标记算法

对于产生的表示后业务线程对对象引用的改变,优化三色标记,是将白色的标识记录,并查找是否有黑色的引用。

5c7fc49a287feb52779782e33060e37b_compress

垃圾回收器和内存大小的关系:

1.serial : 几十兆
2.PS :上百兆-几个G
3.CMS:20G
4.G1:上百G
5.ZGC: 4T - 16T(JDK13)

常见垃圾回收器组合参数设定:(1.8)

-XX:+UseSerialGc = Serial New(Dew) + erial Old
-XX:+UseParNewGC=ParNew +SerialOld
-XX:UseParallelGC = PS+PO (1.8默认)
-XX:+UseParalleOldGC = PS+PO
-XX:+UseG1GC = G1

posted @ 2025-08-28 14:41  唐老师很无聊  阅读(7)  评论(0)    收藏  举报