stop-the-word
JVM由于要执行GC而停止了应用程序的执行
任何一种GC算法中都会发生
多是GC优化通过减少 stop-the-word 发生的时间来提升程序性能
safepoint
分析过程中对象引用关系不会发生变换的点
产生safepoint的地方:方法调用,循环跳转,异常跳转等
安全点数量得适中
JVM运行模式
server:重量级,启动慢,运行快
client:轻量级,启动慢
GC新生代垃圾收集器
Serial收集器(-XX:+UseSerialGC,复制算法)
单线程收集器:进行垃圾收集时,必须暂停所有工程
简单高效,client模式下默认的年轻代收集器
parNew收集器(-XX:UserParNewGC,复制算法)
多线程收集器,其余的行为,特点和Serial收集器一样
单核执行效率不如Serial,在多核下执行才有优势
默认开始线程数为:cpu的线程数
Parallel Scavenge收集器(-XX:+UseParallelGC,复制算法)
吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)
比起关注用户线程停顿时间,更关注系统的吞吐量
在多核下执行才有优势,Server模式下默认的年轻代收集器
GC老年代垃圾收集器
Serial old收集器(-XX:+UseSerialOldGC,标记整理算法)
单线程收集,进行垃圾收集时,必须暂停所有工作线程
简单高效,Client模式下默认的老年代收集器
Parallel Old收集器(-XX:+UseParallelOldGC,标记整理算法)
多线程,吞吐量优先
CMS收集器(-XX:+UseConcMarkSweepGC,标记清除算法)
🌟初始标记:stop-theworld
并发标记:并发追溯标记,程序不会停顿
并发预清理:查找执行并发标记阶段从年轻代晋升到老年代的对象
🌟重新标记:暂停虚拟机,扫描CMS堆中的剩余对象
并发清理:清理垃圾对象,程序不会停顿
并发重置:重置CMS收集器的数据结构
缺点:采用标记清除算法,会出现内存碎片化
G1收集器(-XX:UseG1GC,复制+标记-整理算法)
-
Garbage First收集器的特点
-
并行和并发
分代收集
空间整合
可预测停顿
Garbage First收集器
将整个Java堆内存划分成多个大小相等的Region
年轻代和老年代不再物理隔离
垃圾收集器之间的联系