JVM调优的相关命令

        在进行JVM调试时,熟练使用Linux和Java命令是非常重要的,有利于我们快速发现问题,并进行解决。平时常用的命令有:Linux的Top、Top -Hp等;Java的Jps、Jinfo、Jstack、Jstat、Jmap、Jhat等。下面,我将逐一介绍一下:

1. Linux Top命令 -> 查询高内存/高CPU进程号(pid):

  • 作用:选择占用内存 或 CUP占用率 高的进程号(pid)。
  • 相关快捷键:
    • 按住 shift + M 可按内存大小排序
    • 按住 shift + P 可按CPU占用率大小排序

2. Linux Top -Hp -> 查看某进程下所有线程:

  • 命令解释:
    • -H:进入线程模式
    • -p:指定pid
    • pid:进程号

JVM调优的相关命令_第1张图片  

3. Jps命令 -> 查找正在运行的java进程:

其他作用:Jps -v -> 查看JVM启动时,显式指定的参数信息:

4. Jinfo命令 -> 查询JVM各项配置信息:

jinfo -flag :

  • -flag :查询具体JVM参数。例如 -flag MaxMetaspaceSize
  • pid 进程id

jinfo :

JVM调优的相关命令_第2张图片

拓展:它还可以调整JVM配置信息。

5. Jstack命令 -> 查看Java线程堆栈信息:

jstack > /xx/xx/stack.log:生成JVM当前时刻的线程快照,打印Java线程堆栈信息。

JVM调优的相关命令_第3张图片

jstack -m -> 检查是否有死锁:

JVM调优的相关命令_第4张图片

主要解决线程间死锁、死循环、请求外部资源导致的长时间等待等问题:

  • 重点关注:WAITING状态、 BLOCKED状态
  • 关注:waiting on (a java.lang.Object)
    • 假如有一个进程中100个线程,很多线程都在waiting on ,一定要找到是哪个线程持有这把锁,怎么找?搜索jstack dump的信息,找 ,看哪个线程持有这把锁,它是一般状态是RUNNABLE。
    • 为什么阿里规范里规定,线程的名称(尤其是线程池)都要写有意义的名称
      • 怎么样自定义线程池里的线程名称?(自定义ThreadFactory)

6. Jstat命令 ->监控Java应用程序的资源和性能:

jstat -options :

  • -class (类加载器) -compiler (JIT) -gc (GC堆状态)
  • -gccapacity (各区大小) -gccause (最近一次GC统计和原因)
  • -gcnew (新区统计) -gcnewcapacity (新区大小)
  • -gcold (老区统计) -gcoldcapacity (老区大小)
  • -gcpermcapacity (永久区大小) -gcutil (GC统计汇总)
  • -printcompilation (HotSpot编译统计)

jstat -gc 500 -> 动态观察GC情况,发现频繁GC:

  • jstat -gc 500 : 每个500个毫秒打印GC的情况

7. Jmap命令:

用法一:下载dump文件:

jmap -dump:format=b,file=D:/test/filename.hprof

jmap -dump:format=b,file=/data/dump.hprof 21210
  • 线上系统,内存特别大,jmap执行期间会对进程产生很大影响,甚至卡顿,所以电商不适合。
    • 解决1:设定了参数HeapDump,OOM的时候会自动产生堆转储文件
    • 解决2:很多服务器备份(高可用),停掉这台服务器对其他服务器不影响
    • 解决3:在线定位(一般小点儿公司用不到)

用法二:打印每个class的实例数目,内存占用,类全名信息:

jmap -histo | head -n 20

JVM调优的相关命令_第5张图片

Tips:VM的内部类名字开头会加上前缀"*" ;如果使用-histo:live,只统计活的对象数量。

8. Jhat命令 -> 分析dump文件,生成可视化页面:

jhat -J-Xmx30g filename.hprof

jhat -J-Xmx1g -port 442 /data/dump.hprof

JVM调优的相关命令_第6张图片

9. 查看JVM参数:

9.1 查看已经被用户或者JVM设置过的所有参数命令:

java -XX:+PrintCommandLineFlags -version

9.2 查看JVM 所有参数命令 -> 主要查看修改更新:

java -XX:+PrintFlagsFinal -version

= 等号 是JVM默认加载的参数,有冒号:= 表示人为修改之后的参数

9.3 查看JVM 所有参数命令->查看JVM初始化默认值:

java -XX:+PrintFlagsInitial -version

9.4 查看某一java进程的JVM 配置:

jinfo -flags PID

9.5 查看某个进程JVM的某一参数命令:

jinfo -flag UseG1GC PID

你可能感兴趣的:(jvm,java,linux)