企业级应用开发中经常会遇到以下问题,可以使用工具对JVM进行监管,以便及时查找问题所在 。
内存不足OutOfMemory(大对象没有gc等),内存泄露;
线程死锁,线程数过多;
锁争用(Lock Contention),资源未及时释放(数据库);
JAVA进程CPU消耗过高.
一、Java自带工具
Java安装目录的bin文件加下有一些工具可以用来监控JVM性能,如jconsole、jvisualvm、jmap、jps、jstack、jhat、jstat等 。
1. jconsole
jconsole可以监控Java应用程序(如jar应用、Tomcat等),但被监视的应用程序必须和jconsole是用同一个用户运行的 。jvisualvm的使用和jconsole类似 。
- 本地监控: jconsole pid
- 远程监控: jconsole [ hostname:portNum ]
set JAVA_OPTS= %JAVA_OPTS% -Djava.rmi.server.hostname=HostIPset JAVA_OPTS= %JAVA_OPTS% -Dcom.sun.management.jmxremote.port=8888set JAVA_OPTS= %JAVA_OPTS% -Dcom.sun.management.jmxremote.ssl=falseset JAVA_OPTS= %JAVA_OPTS% -Dcom.sun.management.jmxremote.authenticate=false
连接成功后可以在overview中查看内存、线程、类及CPU使用情况:文章插图
2. probe
Lambda Probe 是基于 Web + AJAX 的强大的免费开源工具,可以用来实时管理一个单独的host 。LambdaProbe拥有几乎所有Tomcat Manager的功能,还包括应用程序、数据源、发布、日志、线程、集群、系统信息、状态、连接器状态这些功能,并能显示 Server 的详细内存占用状态 。
probe war包下载
3. 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分析查看,以便查找内存溢出原因
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并安装 。
5. jstat
查看classloader,compiler,gc相关信息,实时监控资源和性能。jstat工具特别强大,可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量 。
语法结构:
jstat -<option> [-t] [-h<lines>] <pid> [<interval> [<count>]]
Options — 通常使用 -gcutil 查看gc情况
interval – 间隔时间,单位为秒或者毫秒
count — 打印次数,如果缺省则打印无数次
结果说明:
【JVM 性能调优监控工具】S0 — Heap上的 Survivor space 0 区已使用空间的百分比
S1 — Heap上的 Survivor space 1 区已使用空间的百分比
E — Heap上的 Eden space 区已使用空间的百分比
O — Heap上的 Old space 区已使用空间的百分比
P — Perm space 区已使用空间的百分比
YGC — 从应用程序启动到采样时发生 Young GC 的次数
YGCT— 从应用程序启动到采样时 Young GC 所用的时间(单位秒)
FGC — 从应用程序启动到采样时发生 Full GC 的次数
FGCT— 从应用程序启动到采样时 Full GC 所用的时间(单位秒)
GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)
- 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 -gcnew / gcnewcapacity<pid>: 年轻代对象的信息(及其占用量) 。
- jstat -gcold / gcoldcapacity <pid> :old代对象的信息(及其占用量) 。
- jstat -gcpermcapacity <pid>: perm对象的信息及其占用量 。
推荐阅读
- 微信上线“性能检测工具”功能,可测FPS帧率、卡顿、功耗等数据
- 荔枝红茶性能,荔枝红茶泡法
- 微软|Win11用久了会性能下降?微软承认了:这是个bug
- 华硕|240W极限释放!ROG枪神6 Plus超竞版官宣 性能捅破天花板
- 华为|用面积换性能!华为首次公开芯片堆叠封装专利
- Redmi|中端机性能之王!卢伟冰预热Redmi Note 11T Pro:米粉最期待价格
- AMD|SSD硬盘百倍性能提升 AMD将推全新游戏技术
- 长城汽车的发展和性能怎么样
- 长安汽车性能及特点介绍
- Intel|性能猛增35% Intel公开”4nm“ EUV工艺性能:CPU频率冲击6GHz?