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

注:栈、本地方法栈、程序计数器为线程私有。
GC相关:
引用计数器(python)、可达性分析(JVM),可达性分析有STW。
串行执行:垃圾回收器执行的时候应用程序挂起,垃圾回收器有且只有一个后台线程执行垃圾对象的识别和回收;
并行执行:垃圾回收器执行的时候应用程序挂起,但是暂停期间会有多个线程进行识别和回收,可以减少垃圾回收时间;
并发执行:垃圾回收器执行期间,应用程序不用挂起正常运行(当然在某些必要的情况下垃圾回收器还是需要挂起的)
GC算法:
1.标记-清除:GCRoot扫描出未被引用的内存,进行标记,标记后删除。效率高但会产生内存碎片。
2.标记-压缩:清除后,将空出的内存进行整理。内存的可用性高,但整理的开销大。
3.标记-复制:将内存一分为二,进行GC时,将未被标记的内容复制到另一下·区域,进行紧凑存储,同时清除该区域内容。缺点:需要2倍的内存。
4.分代算法:分年轻代和老年代的GC,一般15次(通过参数-XX:MaxTenuringThreshold 配置)后移入老年代。减小了GC的作用范围。
5.增量算法:通过并发的方式,使应用程序与GC线程交替执行,降低了stw的时间。
6.并发算法:并发标记、并发转移、并发重定位。
内存管理模型:

垃圾回收器:



jdk1.8默认使用ps+po
jdk1.9开始默认G1
CMS:
三色标记算法:未被识别过的对象一种颜色(白)、尚未完全识别到全部子对象的一种颜色(灰),完成识别的一种颜色(黑)。

该方式在重新标记处,产生长时间stw。
对于产生的表示后业务线程对对象引用的改变,优化三色标记,是发现完成标识后又有新的引用,会将黑色变为灰色重新标识。
G1:三色标记算法
对于产生的表示后业务线程对对象引用的改变,优化三色标记,是将白色的标识记录,并查找是否有黑色的引用。

垃圾回收器和内存大小的关系:
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

浙公网安备 33010602011771号