(史上最全)Java性能调优工具,你都知道哪些?
文章目录
一、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>
用的最多,示例如下:
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
:将内存使用情况导出到文件中,再用jhat
、MAT
、VisualVM
分析查看,以便查找内存溢出
原因
二: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
类似,都是jdk
的bin
目录自带的。
- 本地监控:
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
离线分析工具
- MemoryAnalyzer tool
- Thread Dump Analyzer
- 等等
四:诊断问题
上面这些命令及工具,都是用来诊断java代码问题的。常见的问题如下:
运行时问题-软件角度
- 内存泄漏,对象未释放
- 线程阻塞、死锁
- 线程死循环
- 网络IO连接超时时间过长
- 磁盘不可写
- 等等
运行时问题-硬件角度
- 内存占用高
- CPU占用高
- 网络无反应
- 硬盘空间满
- 等等
开心一刻
一时髦女子走上公交车,见一空坐便掏出纸巾猛擦一阵,刚要坐不巧放一屁,旁边一男子笑道:“我KAO,真他妈干净,擦完还要吹吹”
相关链接
https://www.cnblogs.com/anxiao/p/6796644.html
https://www.cnblogs.com/timlearn/p/4088626.html
https://www.cnblogs.com/Lawson/p/4796957.html
上一篇: JS之原生数组splice方法实例
下一篇: 分享几个Java编程的典型例子