jvm三色标记:
黑:跟对象,其子对象已经扫描过
灰:对象本身被扫描过,其子对象未被扫描
白:未被扫描/垃圾对象
三色标记的问题:并发下漏标问题
cms漏标问题解决方法:
1 incrementtal update方法:既一个白色对象被一个黑色对象引用,则将黑色对象制成灰色,从而重新扫描
G1漏标问题解决方法:
1 快照
2 最终标志:对用户线程短暂的暂停,处理并发阶段遗留的少量stab(漏标)
跨代引用:老年代对象引用了新生代对象,出发gc时引起的问题
g1的解决方法
1 cardTable: 卡表,对老年代特定大小内存的进行表示
2 RSet: 记忆集,hash,记录其他region到本region对象的引用
3 由于rset的存在,占用了20%的内存,如果对空间小于六个g不要用g1
安全点
1 gc stw时,需要用户线程进入最近的安全点,这样就不会导致引用变化
2 常见的安全点 方法跳转 循环跳转 异常跳转
安全区域
1 线程处于睡眠或者阻塞时,无法进入安全点,引入了安全区域
2 进入某一段代码时,不会导致引用的变化
3 userThread进入安全区域,标识进入安全区域->gc开始->gc结束-> userThread 离开安全线程
gc的指标
内存占用 吞吐量 stw
eplison :不gc 一般用于无gc时的性能测试
zgc :染色指针 ,10ms oracle的私生子
Shenandoah:染色指针,100ms 非oracle的私生子
Gc日志常用参数:
-Xmn -Xms -Xmx –Xss 年轻代 最小堆 最大堆 栈空间 -
-XX :+UseTLAB 使用 TLAB,默认打开 -
-XX :+PrintTLAB 打印 TLAB 的使用情况 -
-XX :TLABSize 设置 TLAB 大小
-XX :+DisableExplicitGC 启用用于禁用对的调用处理的选项 System.gc() -
-XX :+PrintGC 查看 GC 基本信息 -
-XX :+PrintGCDetails 查看 GC 详细信息 -
-XX :+PrintHeapAtGC 每次一次 GC 后,都打印堆信息 -
-XX :+PrintGCTimeStamps 启用在每个 GC 上打印时间戳的功能 -
-XX :+PrintGCApplicationConcurrentTime 打印应用程序时间(低) -
-XX :+PrintGCApplicationStoppedTime 打印暂停时长(低) -
-XX :+PrintReferenceGC 记录回收了多少种不同引用类型的引用(重要性低) -verbose:class 类加载详细过程 -
-XX :+PrintVMOptions 可在程序运行时,打印虚拟机接受到的命令行显示参数 -
-XX :+PrintFlagsFinal -
-XX :+PrintFlagsInitial 打印所有的 JVM 参数、查看所有 JVM 参数启动的初始值(必须会用) -
-XX :MaxTenuringThreshold 升代年龄,最大值 15, 并行(吞吐量)收集器的默认值为 15,而 CMS 收集器的默认值为 6。 Parallel 常用参数 -
-XX :SurvivorRatio 设置伊甸园空间大小与幸存者空间大小之间的比率。默认情况下,此选项设置为 8 -
-XX :PreTenureSizeThreshold 大对象到底多大,大于这个值的参数直接在老年代分配 -
-XX :MaxTenuringThreshold 升代年龄,最大值 15, 并行(吞吐量)收集器的默认值为 15,而 CMS 收集器的默认值为 6。 -
-XX :+ParallelGCThreads 并行收集器的线程数,同样适用于 CMS,一般设为和 CPU 核数相同 -
-XX :+UseAdaptiveSizePolicy 自动选择各区大小比例 CMS 常用参数 -
-XX :+UseConcMarkSweepGC 启用 CMS 垃圾回收器 -
-XX :+ParallelGCThreads 并行收集器的线程数,同样适用于 CMS,一般设为和 CPU 核数相同
-XX :CMSInitiatingOccupancyFraction 使用多少比例的老年代后开始 CMS 收集,默认是 68%(近似值),如果频繁发生 SerialOld 卡顿,应该调小,(频繁 CMS 回 收)-
-XX :+UseCMSCompactAtFullCollection 在 FGC 时进行压缩 -
-XX :CMSFullGCsBeforeCompaction 多少次 FGC 之后进行压缩 -
-XX :+CMSClassUnloadingEnabled 使用并发标记扫描(CMS)垃圾收集器时,启用类卸载。默认情况下启用此选项。 -
-XX :CMSInitiatingPermOccupancyFraction 达到什么比例时进行 Perm 回收,JDK 8 中不推荐使用此选项,不能替代。 -
-XX :GCTimeRatio 设置 GC 时间占用程序运行时间的百分比(不推荐使用) -
-XX :MaxGCPauseMillis 停顿时间,是一个建议时间,GC 会尝试用各种手段达到这个时间,比如减小年轻代 G1 常用参数 -
-XX :+UseG1GC 启用 CMS 垃圾收集器 -
-XX :MaxGCPauseMillis 设置最大 GC 暂停时间的目标(以毫秒为单位)。这是一个软目标,并且 JVM 将尽最大的努力(G1 会尝试调整 Young 区的块数来)来实 现它。默认情况下,没有最大暂停时间值。 -
-XX :GCPauseIntervalMillis GC 的间隔时间 -
-XX :+G1HeapRegionSize 分区大小,建议逐渐增大该值,1 2 4 8 16 32。随着 size 增加,垃圾的存活时间更长,GC 间隔更长,但每次 GC 的时间也会更长 -
-XX :G1NewSizePercent 新生代最小比例,默认为 5% -
-XX :G1MaxNewSizePercent 新生代最大比例,默认为 60% -
-XX :GCTimeRatioGC 时间建议比例,G1 会根据这个值调整堆空间 -
-XX :ConcGCThreads 线程数量 -
-XX :InitiatingHeapOccupancyPercent 启动 G1 的堆空间占用比例,根据整个堆的占用而触发并发 GC 周期