本文主要是工作过程中总结的一些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
- 输出jvm启动时的参数 -XX:+PrintFlagsInitial
- 禁用代码中显示的触发FULL GC [System.gc()]:-XX:+DisableExplicitGC
- 64位机器上压缩指针 -XX:+UseCompressedOops
- 禁用类验证 -Xverfy:none
- 禁用类元数据回收 -Xnoclassgc
- 确定堆内存大小 -Xmx 堆最大内存, -Xms对最小内存
合理分配新生代和老生代-Xmn 新生代大小, -XX:SurvivorRatio Eden和Survivor空间的比例 默认是8 设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代) -XX:NewRatio=4 默认是2
- 设置每个线程的堆栈大小,如:-Xss128k
- 导致jvm停顿的原因
- 垃圾收集
- 代码反优化
- Flushing code
- 类重定义如热加载
- 取消偏向锁
- 调试动作(死锁检测,输出线程堆栈)
- STW的四个阶段
- Spin阶段:因为jvm在决定进入全局safepoint的时候,有的线程在安全点上,而有的线程不在安全点上,这个阶段是等待未在安全点上的用户线程进入安全点。
- Block阶段:即使进入safepoint,用户线程这时候仍然是running状态,保证用户不在继续执行,需要将用户线程阻塞
- Cleanup:这个阶段是JVM做的一些内部的清理工作
- VM Operation. JVM执行的一些全局性工作,例如GC,代码反优化,偏向锁
- jvm停顿时间的输出:-XX:+PrintGCApplicationStoppedTime 上一次gc停顿程序运行时间 -XX:+PrintGCApplicationConcurrentTime
- jvm停顿原因分析: -XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1
- vmop:引发STW的原因,以及触发时间该项常见的输出有:RevokeBias、BulkRevokeBias、Deoptimize、G1IncCollectionPause。GC log可以根据该项内容定位Total time for which application threads…引发的详细信息。
- total :STW发生时,JVM存在的线程数目。
- initially_running :STW发生时,仍在运行的线程数,这项是Spin阶段的 时间来源
- wait_to_block : STW需要阻塞的线程数目,这项是block阶段的时间来源
输出如下
发生时间 操作 线程 总数 正在运行 等待阻塞 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
- -XX:+UnlockDiagnosticVMOptions -XX:-DisplayVMOutput -XX:+LogVMOutput -XX:LogFile=vm.log 可以将详细的停顿信息输出到日志文件中
- 来解锁任何额外的隐藏参数-XX:+UnlockDiagnosticVMOptions和-XX:+UnlockExperimentalVMOptions
- 输出启动时的参数信息和vm根据环境设置的参数信息: -XX:+PrintCommandLineFlags
- CMS垃圾收集器的理解
- java启动参数-agentlib,最常用的两种常见一个是jdwp远程调试,还有个hprof内存和CPU分析
- string的intern方法,内部实现是hash数据结构,参数StringTableSize可以用来控制散列桶的数量,java8默认是60013,自定义的话最好设置一个素数
- JIT相关参数:-Djava.compiler=NONE禁用JIT,-XX:+PrintCompilation 打印JIT编译情况
定制JIT编译的参数 -XX:CompileCommand
待解决:
GC overhead limit exceeded问题