JVM调优简单理解:CSDN
什么是垃圾:GC中的垃圾指存在于内存中,不会再被使用的对象
GC处理流程
- 对象实例化需要依据关键字new完成,所有新对象都会在伊甸园区开辟,如果伊甸园区的内存空间不足会发生MinorGC。Member mem = new Member(),很小,直接保存在伊甸园;
- 伊甸园区不是无限大的,所以肯定有些对象执行了N次的MinorGC后还会存在,那么这些对象将进入到存活区(存活区有两个,一个负责保存存活对象,一个负责晋升(将对象复制到老年代),永远都有一个空内存);
- 如果经历过若干次的MinorGC回收处理之后发现空间依然不够使用的,那么则进行老年代的GC回收,执行了一个MajorGC(Full GC,性能很差),如果可以回收空间,则继续进行MinorGC;
- 如果MajorGC失败,则继续内存已经占用完满,则抛出OOM异常(out of memory);
- 如果新创建的对象的空间占用过大将被直接保存到老年代之中。
JDK1.8 会根据系统硬件不同自动选择不同的GC回收策略
- 单核CPU -》串行回收器
- 多核CPU -》并行回收器
补充: JDK8使用 G1 :-XX:+UseG1GC JDK11 开始默认使用 G1 回收器
内存分配策略:
1)对象优先在 Eden 分配
2)大对象直接进入老年代
3)长期(默认最大15次MinorGC)存活的对象进入老年代
年轻代回收算法
- 复制清理算法:将保留的对象复制到存活区之中,存活区的内容会保存到老年代之中CSDN
- Eden 区总是会有大量的对象产生,所有 HotSpot 虚拟机使用了BTP (单一CPU时代所有的对象依次保存)TLAB (拆分为不同的块,依据CPU的核心个数拆分)
技术形式
老年代回收算法
- 标记-清除算法:先进行对象的第一次标记,在这段时间之内会暂停程序的执行(STW)(如果标记的时间长或者内容过多),这个暂停时间就会越长就会产生串行标记、并行标记使用问题
- 标记-压缩算法:基于 标记-清除 算法,将零散的内存空间进行整理重新集合再分配
垃圾回收器
-
作用
-
分配内存:垃圾回收算法的设计往往制约了内存分配的方式
-
确保存活对象不会被回收
-
回收垃圾对象
-
分类
-
年轻代 : MinoirGC
-
串行GC:Serial
-
并行GC:ParNewGC
-
并行回收GC:PS
-
-
老年代
-
串行GC:Serial
-
并行GC:ParNewGC
-
并发GC:CMS( - STW 暂停问题)
-
-