JVM 调优

40 阅读2分钟

命令参数

-XX:+PrintCommandLineFlags:查看默认的 JVM 启动参数
-XX:+PrintGC:查看 GC 信息
-XX:+PrintGCDetails:查看 GC 详细信息

-Xloggc:/opt/gc/logs/XXX-%t-gc.log gc日志的路径 t%是启动项目的时间
-XX:+UseGCLogFileRotation 循环写GC文件,如果设定的文件写满了,回第一个文件写
-XX:NumberOfGCLogFiles=5 GC日志的文件个数
-XX:GCLogFileSize=20M 每个GC日志的大小
-XX:+PrintGCDetails 查看GC详细信息
-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2020-09-28T16:09:07.628+0800)
-XX:+PrintGCCause 在GC日志中包括GC原因
-XX:+PrintGCApplicationStoppedTime:应用停顿时间,打开这些选项能够记录下所有的安全点,而不止是GC暂停的。
-XX:+PrintGCApplicationConcurrentTime:打印应用执行时间
-XX:+HeapDumpOnOutOfMemoryError 当JVM发生OOM时,自动生成DUMP文件
-XX:HeapDumpPath=XXX 输出到的路径

吞吐量与停顿时间的选择

吞吐量:用户代码执行时间/(用户代码执行时间+垃圾回收时间)

吞吐量可以最高效率的利用处理器资源,尽快完成程序的运用任务,主要适合在后台运算而不需要太多交互的分析任务,一般可以选择 PS + PO 垃圾回收器;

停顿时间越短越适合需要与用户交互或需要保证服务响应质量的程序,选择 CMS、G1、ZGC。

问题定位的方法

jps 查看 java 的进程

  • top 命令找到占比最高的进程。
  • top -Hp 观察进程中的线程,哪个线程和进程占比高。
  • jstack 关注线程状态,重点:WAITING、BLOCKED。
  • jstat -gc PID 500 :每 500 ms 打印一次 GC 信息,可以不指定。
  • jmap -histo PID | head -30 查找对象占用内存情况,只展示占内存最多的前三十个
  • jmap -dump:file=a.dump PID 线上内存特别多的时候会对进程产生很大影响,甚至卡顿(电商类的最不适合),除非有高可用,这台机器暂停不影响业务。

jstack 查看死锁状态

远程监控

启动命令 JMX

java
-XX:+PrintCommandLineFlags
-XX:+PrintGC
-Djava.rmi.server.hostname=IP
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=端口号
-Dcom.sun.management.jmxremote.rmi.port=端口号 这个可以先不配置,说是 JMX 在远程连接时,会随机开启一个 RMI 端口作为连接的数据端口,很有可能这个端口会被防火墙给阻止,以至于连接超时失败,可以通过这个指定
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
监控权限认证配置:https://blog.csdn.net/inventecsh/article/details/86625770 segmentfault.com/a/119000003…
SSL方式启动 :https://blog.csdn.net/jhonhai/article/details/108436795

不过正式一般不用,主要用测试监控用,因为影响 CPU 运行效率。


在线定位

arthas

使用:arthas.aliyun.com/doc/advance…
还可以热替换代码

MAT

MAT使用

拥有对象 C 的引用的所有对象都称为 Incoming references.
对象 C 引用的所有对象都称为 Outgoing References.