JVM调优常用参数和注意点备忘录
2019-01-27 23:14
465 查看
本文主要是工作过程中总结的一些jvm调优的参数和注意的地方,作为一个备忘录,先占个坑,有时间在来细化具体的实例。
- gc日志是覆盖的方式如果文件名字固定会导致上一次被覆盖可以采用这个-Xloggc:backv2_gc_%t.log
- jinfo可以动态修改java -XX:+PrintFlagsFinal -version|grep manageable这些参数
- 打印java可配置的非稳定参数:java -XX:+PrintFlagsFinal ,输出的信息中 “:=” 表明了参数被用户或者 JVM 赋值了
- jstat可以查看类加载和gc的耗时信息 -t参数表示每行前面输出时间
- java堆溢出时获取heap dump -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./m.hprof
- 当系统发生OOM错误时,虚拟机在错误发生时运行一段第三方脚本, 比如, 当OOM发生时,重置系统 -XX:OnOutOfMemoryError=c:\reset.bat
- 取消outofmemory警告:-XX:-UseGCOverheadLimit
- 获取GC信息 -verbose:gc(-verbose:class可以输出类加载的信息) 或者 -XX:+PrintGC 打印gc日志
- 如果要获得更加详细的信息, 可以使用 -XX:+PrintGCDetails.
如果需要查看新生对象晋升老年代的实际阈值, 可以使用参数 -XX:+PrintTenuringDistribution
java8中使用这个参数没有详细输出各个年龄的分布,因为java8默认的收集器是ParallelGC和ParallelGC Old,
这个收集器注重吞吐量没有用年龄,所以没必要打印详细的年龄分布。只会显示晋升到老年代的阈值还有期望的Survivor区的预期大小。- 输出jvm启动时的参数 -XX:+PrintFlagsInitial
合理分配新生代和老生代-Xmn 新生代大小, -XX:SurvivorRatio Eden和Survivor空间的比例 默认是8 设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代) -XX:NewRatio=4 默认是2
老年代和新生代大小比例调节:如果应用存在大量的临时对象,应该选择更大的年轻代;如果存在相对较多的持久对象,年老代应该适当增大。但很多应用都没有这样明显的特性,在抉择时应该根据以下两点:
a.本着Full GC尽量少的原则,让年老代尽量缓存常用对象,JVM的默认比例1:2也是这个道理
b.通过观察应用一段时间,看其他在峰值时年老代会占多少内存,在不影响Full GC的前提下,根据实际情况加大年轻代,比如可以把比例控制在1:1。但应该给年老代至少预留1/3的增长空间
-
垃圾收集
-
Spin阶段:因为jvm在决定进入全局safepoint的时候,有的线程在安全点上,而有的线程不在安全点上,这个阶段是等待未在安全点上的用户线程进入安全点。
-
vmop:引发STW的原因,以及触发时间该项常见的输出有:RevokeBias、BulkRevokeBias、Deoptimize、G1IncCollectionPause。GC log可以根据该项内容定位Total time for which application threads…引发的详细信息。
输出如下
发生时间 操作 线程 总数 正在运行 等待阻塞 vmop [threads: total initially_running wait_to_block] [time: spin block sync cleanup vmop] page_trap_count 0.462: ForceSafepoint [ 8 0 1 ] [ 0 0 0 0 0 ] 0
定制JIT编译的参数 -XX:CompileCommand
待解决:
GC overhead limit exceeded问题