持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天,点击查看活动详情
官方文档:docs.oracle.com/javase/8/do…
-
测试堆空间常用的jvm参数:
-
-XX:+PrintFlagsInitial : 查看所有的参数的默认初始值
-
-XX:+PrintFlagsFinal :查看所有的参数的最终值(可能会存在修改,不再是初始值)
-
具体查看某个参数的指令: jps:查看当前运行中的进程 jinfo -flag SurvivorRatio 进程id -
-Xms:初始堆空间内存 (默认为物理内存的1/64)
-
-Xmx:最大堆空间内存(默认为物理内存的1/4)
-
-Xmn:设置新生代的大小。(初始值及最大值)
-
-XX:NewRatio:配置新生代与老年代在堆结构的占比
-
-XX:SurvivorRatio:设置新生代中Eden和S0/S1空间的比例
-
-XX:MaxTenuringThreshold:设置新生代垃圾的最大年龄
-
-XX:+PrintGCDetails:输出详细的GC处理日志
-
打印gc简要信息:① -XX:+PrintGC ② -verbose:gc
-
-XX:HandlePromotionFailure:是否设置空间分配担保
空间分配担保
1、在发生Minor GC之前,虚拟机会检查老年代最大可用的连续空间是否大于新生代所有对象的总空间。
-
如果大于,则此次Minor GC是安全的
-
如果小于,则虚拟机会查看**-XX:HandlePromotionFailure**设置值是否允担保失败。
-
如果HandlePromotionFailure=true,那么会继续检查老年代最大可用连续空间是否大于历次晋升到老年代的对象的平均大小。
- 如果大于,则尝试进行一次Minor GC,但这次Minor GC依然是有风险的;
- 如果小于,则进行一次Full GC。
-
如果HandlePromotionFailure=false,则进行一次Full GC。
-
历史版本
- 在JDK6 Update 24之后,HandlePromotionFailure参数不会再影响到虚拟机的空间分配担保策略,观察openJDK中的源码变化,虽然源码中还定义了HandlePromotionFailure参数,但是在代码中已经不会再使用它。
- JDK6 Update 24之后的规则变为只要老年代的连续空间大于新生代对象总大小或者历次晋升的平均大小就会进行Minor GC,否则将进行Full GC。即 HandlePromotionFailure=true
合理的堆空间设置可以很好地避免oom的出现,对于堆的设置可以参考以下几条:
- 年轻代是对象的诞生、成长、消亡的区域,一个对象在这里产生、应用,最后被垃圾回收器收集、结束生命。
- 老年代放置长生命周期的对象,通常都是从Survivor区域筛选拷贝过来的Java对象。
- 当然,也有特殊情况,我们知道普通的对象可能会被分配在TLAB上;
- 如果对象较大,无法分配在 TLAB 上,则JVM会试图直接分配在Eden其他位置上;
- 如果对象太大,完全无法在新生代找到足够长的连续空闲空间,JVM就会直接分配到老年代。
- 当GC只发生在年轻代中,回收年轻代对象的行为被称为Minor GC。
- 当GC发生在老年代时则被称为Major GC或者Full GC。
- 一般的,Minor GC的发生频率要比Major GC高很多,即老年代中垃圾回收发生的频率将大大低于年轻代。