java 虚拟机性能_Java虚拟机性能监控与调优

1 基于JDK命令行工具的监控

1.1 JVM的参数类型

1.1.1 标准参数

在JVM的各个版本基本上保持不变,很稳定的。

-help

-server -client

-version -showversion

-cp -classpath

1.1.2 X参数

非标准化参数

-Xint: 解释执行

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

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

1.1.3 XX参数

非标准化参数

相对不稳定

主要用于JVM调优和Debug

Boolean类型

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

比如:-XX:+UseConcMarkSweepGC

-XX:+UseG1GC

非Boolean类型

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

比如:-XX:MaxGCPauseMillis=500

-XX:GCTimeRatio=19

-Xmx  -Xms

-Xms等价于-XX:InitialHeapSize

-Xmx等价于-XX:MaxHeapSize

命令

作用

ps -ef|grep java

查看java的进程相关信息,以及启动的配置信息

jinfo -flag MaxHeapSize pid

查看该pid的JVM最大的堆内存大小

jinfo -flag ThreadStackSize pid

查看该pid的JVM每个线程的栈大小

1.2 运行时JVM参数查看

-XX:+PrintFlagsInitial

初始值

-XX:+PrintFlagsFinal

最终值

1bdf903bdcfcbdfa5e09a0c22713b465.png

=  表示默认值

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

-XX:+UnlockExperimentalVMOptions  解锁实验参数

-XX:+UnlockDiagnosticVMOptions    解锁诊断参数

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

jps

类似与Linux服务器上的ps功能。

相关命令:

jps -help  查看帮助

jps -l  查看正在运行的列表

jinfo

查看正在运行的JVM里面的参数值。

相关命令:jinfo -flag MaxHeapSize pid  查看正在运行的进程为PID的JVM的最大堆内存

jinfo -flags pid  查看正在运行的进程为PID的JVM的已经被修改过的JVM的参数值

查看最大内存

7ba32fda5d2e2fe94dac8417131e6cd9.png

查看垃圾回收器

3a496027dbf08247ba29220d55039c17.png

1.3 jstat查看虚拟机统计信息

类装载

参考命令:jstat -class pid  查看类加载的信息

jstat -class pid 1000 10  每隔1000ms打印一次类加载信息,打印10次。

3fc01190adeec0343f7cc465f18f140d.png

垃圾收集

参考命令:jstat -gc pid  查看进程号为pid的JVM的垃圾收集信息,具体响应详细参数jstat命令详细参考

jstat -gc pid 1000 10  每隔1000ms打印一次进程号为pid的JVM的垃圾收集信息,打印10次。

c440ba0a55195a5052f06657032e8c5c.png

JIT编译

参考指令:jstat -compiler pid  查看进程号为pid的JVM的即时编译信息。

bf95030778e173bc19ee3ffbdc2c949b.png

2 Jmap+MAT实战内存溢出

7c32c111ba7e4b1053483db4ff343bc0.png

2.1 模拟对内存溢出的代码参考:

2.2 如何导出内存映像文件

2.2.1 内存溢出自动导出

程序启动的时候,设置以下参数

-XX:+HeapDumpOnOutOfMemoryError

-XX:HeapDumpPath=./

2.2.2 使用jmap命令手动导出

jmap -dump:format=b,file=heap.hprof pid  导出进程号为pid的JVM的dump文件

jmap -heap pid               打印进程号为pid的JVM的堆信息

jmap命令

option: -heap, -clstats, -dump:, -F

2.3 MAT分析内存溢出

将步骤2.2导出的dump文件,用MAT工具打开分析。

2.4 JAVA线程状态

NEW  WAITING  RUNNABLE  TIMED_WAITING  BLOCKED  TERMINATED

3 实战死循环导致CPU飙高

查找死循环导致CPU飙高问题的常用指令:

top -p pid -H          #打印该进程的所有线程,查看占用CPU资源超高的线程ID,该线程ID为10进制,要用下面的命令将其转换为16进制,然后在stack信息中查找详细信息

printf "%x" 十进制的线程id    #将十进制的线程id转换为16进制

jstack pid               #打印程序的stack信息,从中找出CPU占用超过的线程ID的stack信息

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值