欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

(史上最全)Java性能调优工具,你都知道哪些?

程序员文章站 2022-04-22 12:58:41
...

一、JDK指令

jps命令

jps用于列出Java的进程,jps还可以增加参数

  • -m用于输出传递给Java进程的参数

  • -l用于输出主函数的完整路径

  • -v可以用于显示传递给jvm的参数

jstat命令

jstat可以查看堆内存的使用情况以及gc情况,功能强大。

语法如下:

jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

Option :通常使用 -gcutil 查看gc情况
interval : 间隔时间,单位为秒或者毫秒
count : 打印次数,如果缺省则打印无数次

<option>可选参数如下:

  • jstat -class <pid> : 显示加载class的数量,及所占空间等信息
  • jstat -compiler <pid> : 显示VM实时编译的数量等信息
  • jstat -gc <pid> : 显示gc的信息,查看gc的次数,及时间
  • jstat -gccapacity <pid>: 显示VM内存中三代(young,old,perm)对象的使用和占用大小
  • jstat -gcutil <pid> : 统计gc信息(一般用的最多)
  • jstat -gcnewcapacity <pid> :new对象的信息及其占用量
  • jstat -gcold <pid> :old对象的信息
  • jstat -gcoldcapacity <pid> :old对象的信息及其占用量
  • jstat -gcpermcapacity <pid>: perm对象的信息及其占用量
  • jstat -gcutil <pid>:统计gc信息统计
  • jstat -printcompilation <pid>:当前VM执行的信息
  • jstat -printcompilation <pid> m n:当前VM执行的信息,并且每m毫秒打印一次,一共打印n次。eg:jstat -printcompilation 3024 250 6是每250毫秒打印一次,一共打印6次

其中就jstat -gcutil <pid>用的最多,示例如下:
(史上最全)Java性能调优工具,你都知道哪些?

S0 — Heap上的 Survivor space 0 区已使用空间的百分比
S1 — Heap上的 Survivor space 1 区已使用空间的百分比
E — Heap上的 Eden space 区已使用空间的百分比
O — Heap上的 Old space 区已使用空间的百分比
P — Perm space区已使用空间的百分比 (jdk1.8之后,永久代被元空间取代,为M)
YGC — 从应用程序启动到采样时发生 Young GC 的次数
YGCT– 从应用程序启动到采样时 Young
GC 所用的时间(单位秒)
FGC — 从应用程序启动到采样时发生 Full GC 的次数
FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)
GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)

jstat其它示例解析

jstack命令

jstack用于生成线程快照(线程的堆栈信息及线程运行状态),主要目的是定位线程出现长时间停顿的原因,如线程间死锁死循环请求外部资源导致的长时间等待
 语法:jstack [Options] <pid>
 
Options:可选参数如下:

  • -F 强制线程转储
  • -m 打印java和本机帧(混合模式)
  • -l 长清单。打印关于锁的附加信息
  • -h 或-help打印此帮助消息

jstack 6548 > d:temp/m.dump线程堆栈信息输入到磁盘文件中,(> 输入的意思,6548是pid号)注意:m.dump是自动生成的文件,文件的后缀名也可以是txt格式等等

jhat命令

jhat可以对JVM中导出的文件进行分析,使用命令 jhat fileName 即可以在浏览器中输入http://localhost:7000查看内存信息。如果Dump文件太大需要加上-J-Xmx512m指定最大堆内存,如 jhat -J-Xmx512m [-port 9998] tmp.bin

分析内存还可以使用Eclipse的Memory Analyzer,插件地址http://download.eclipse.org/releases/juno,找到General Purpose Tools底下的Memory Analyzer并安装。

jinfo命令

jinfo可以用来查看正在运行的Java应用程序的扩展参数,甚至在运行时修改部分参数,它的基本语法为:

jinfo  <option>  <pid>

jinfo可以查看运行时参数:

jinfo -flag MaxTenuringThreshold 31518
-XX:MaxTenuringThreshold=15

jinfo还可以在运行时修改参数值:

> jinfo -flag PrintGCDetails 31518
-XX:-PrintGCDetails
> jinfo -flag +PrintGCDetails 31518
> jinfo -flag PrintGCDetails 31518
-XX:+PrintGCDetails
jmap命令

打印java进程的堆内存信息。

  • jmap -heap pid :查看heap的概要信息,GC使用的算法、heap的配置及wise heap的使用情况.
  • jmap -histo[:live] pid :查看堆内存中的每个类的类名、实例数量、内存占用大小
  • jmap -dump:live, format=b, file=fileName pid :将内存使用情况导出到文件中,再用jhatMATVisualVM分析查看,以便查找内存溢出原因

二:Linux指令

  • top, top -Hp pid
  • free
  • df
  • netstat, netstat -natp
  • 等等

三:工具

实时分析工具

  • Jconsole
  • VisualVM
  • JProfiler
  • JavaMelody
  • LambdaProbe
  • 等等

这里主要介绍两款工具Jconsole和VisualVM

Jconsole

jconsole可以监控Java应用程序(如jar应用、tomcat等),但被监视的应用程序必须和jconsole是用同一个用户运行的。jvisualvm的使用和jconsole类似,都是jdkbin目录自带的。

  • 本地监控: jconsole <pid>
  • 远程监控: jconsole [ hostname:port ]

使用远程监控需要配置jmx代理信息,修改Tomcat的bin目录下的catalina.bat,如果是springboot直接修改启动参数即可

set JAVA_OPTS= %JAVA_OPTS% -Djava.rmi.server.hostname=HostIP
set JAVA_OPTS= %JAVA_OPTS% -Dcom.sun.management.jmxremote.port=8888
set JAVA_OPTS= %JAVA_OPTS% -Dcom.sun.management.jmxremote.ssl=false
set JAVA_OPTS= %JAVA_OPTS% -Dcom.sun.management.jmxremote.authenticate=false 
VisualVM

VisualVM详解及使用

离线分析工具

  • MemoryAnalyzer tool
  • Thread Dump Analyzer
  • 等等

四:诊断问题

上面这些命令及工具,都是用来诊断java代码问题的。常见的问题如下:

运行时问题-软件角度

  • 内存泄漏,对象未释放
  • 线程阻塞、死锁
  • 线程死循环
  • 网络IO连接超时时间过长
  • 磁盘不可写
  • 等等

运行时问题-硬件角度

  • 内存占用高
  • CPU占用高
  • 网络无反应
  • 硬盘空间满
  • 等等

开心一刻
一时髦女子走上公交车,见一空坐便掏出纸巾猛擦一阵,刚要坐不巧放一屁,旁边一男子笑道:“我KAO,真他妈干净,擦完还要吹吹”
(史上最全)Java性能调优工具,你都知道哪些?

相关链接
https://www.cnblogs.com/anxiao/p/6796644.html
https://www.cnblogs.com/timlearn/p/4088626.html
https://www.cnblogs.com/Lawson/p/4796957.html