Java生产环境下性能监控与调优详解

Author Avatar
itning 4月 23, 2019
  • 在其它设备中阅读本文章

基于JDK命令行工具的监控

X参数

非标准化参数 有可能会变 但变化比较小

  • -Xint

    解释执行

  • -Xcomp

    第一次使用就编译成本地代码

  • -Xmixed

    混合模式,JVM自己来决定是否编译成本地代码

XX参数

非标准化参数 相对不稳定 主要用于JVM调优和Debug

Boolean类型

格式:-XX:[+-]<name>表示启用或者禁用name属性

比如:

-XX:+UseConcMarkSweepGC 启用CMS垃圾回收器

-XX:+UseG1GC 启用G1垃圾回收器

非Boolean类型

格式:-XX:<name>=<value>表示name属性的值是value

比如:

-XX:MaxGCPauseMillis=500 GC最大停顿时间500ms

-XX:GCTimeRatio=19 Ratio为19

-Xms等价于-XX:InitialHeapSize

-Xmx等价于-XX:MaxHeapSize

查看JVM运行时参数

  • -XX:+PrintFlagsInitial 查看初始值

  • -XX:+PrintFlagsFinal 查看最终值

  • -XX:+UnlockExperimentalVMOptions 解锁实验参数

  • -XX:+UnlockDiagnosticVMOptions 解锁诊断参数

  • -XX:+PrintCommandLineFlags 打印命令行参数

  • =表示默认值

  • :=被用户或者JVM修改后的值

  • jps命令用于查看JAVA进程(-l参数完全类名)

  • jinfo命令查看java进程参数信息

    jinfo -flag MaxHeapSize 12188 查看进程号为12188的最大堆大小

    -flags查看手动更改过值的JVM参数

  • jstat命令用于查看JVM统计信息

    类装载 垃圾收集 JIT编译

    jstat -class 6666 1000 10查看进程6666的类装载信息 每隔1000ms打印一次共打印10次

    -gc 6666 1000 10查看垃圾回收信息

    -compiler -printcompilation 查看JNI编译情况

导出内存映像文件

内存溢出自动导出

-XX:+HeapDumpOnOutOfMemoryError 内存溢出时自动导出Dump

-XX:HeapDumpPath=./ 导出路径

使用jmap命令手动导出

jmap -dump:format=b,file=heap.hprof 16940

使用MAT分析内存溢出

工具下载地址:https://www.eclipse.org/mat/

jstack查看线程状态

jstack 进程ID > xx.txt

Btrace 修改字节码

  • 在JVisualVM中添加Btrace插件,添加classpath
  • 使用命令行btrace <pid> <trace_script>

Tomcat

psi-probe监控

该工具用来监控tomcat的状态

线程优化

..

Nginx

GC

可视化GC日志分析工具

ParallelGC调优

GC调优步骤

  1. 打印GC日志
  2. 根据日志得到关键性指标
  3. 分析GC原因,调优JVM参数
  • 除非确定,否则不要设置最大堆内存
  • 优先设置吞吐量目标
  • 如果吞吐量目标达不到,调大最大内存,不能让OS使用Swap,如果仍然达不到,降低目标。
  • 吞吐量能达到,GC时间太长,设置停顿时间的目标。

G1 GC调优

  • 年轻代大小:避免使用-Xmn,XX:NewRatio等显式设置Young区大小,会覆盖暂停时间目标。
  • 暂停时间目标:暂停时间不要太苛刻,其吞吐量目标是90%的应用程序时间和10%的垃圾回收时间,太严苛会直接影响吞吐量。

原创内容,转载请注明出处!
本文链接:https://blog.itning.top/posts/J2SE/20190423-Detailed-performance-monitoring-and-tuning-in-Java-production-environment.html