JVM虚拟机可分析文件如下:
异常堆栈
GC日志
线程快照(threaddump/javacore文件)
堆转储快照(heapdump/hprof文件)
注意:分析dump文件的工具:
Eclipse Memory Analyzer、
IBM HeapAnalyzer [2]、
VisualVM
1、jps (JVM Process Status Tools)显示系统中所有HotSpot虚拟机进程
2、jstat (JVM Statistics Monitoring Tool)用于收集HotSpot虚拟机各方面的运行数据
3、jinfo (Configuration Info For Java)显示虚拟机配置信息
4、jmap (Memory Map For Java)生成虚拟机内存转储快照(heapdump文件)
5、jhat (JVM Heap Dump Brower)
用于分析heapdump文件(对应jmap),分析完后会建立一个HTTP/HTML 服务器,让用户可以在浏览器中查看分析结果,例如: eclipse.bin是dump文件
分析完成之后,通过浏览器访问分析结果:http://localhost:7000
分析内存泄漏问题主要会使用到其中
的“Heap Histogram”(与jmap-histo功能一样)与OQL页签的功能
6、jstack(Stack Trace For Java)
该命名用于生成虚拟机当前时刻的线程快照(一般城市threaddump或者javacore文件);
线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈集合;
分析线程快照的主要目的:
1)定位线程出现长时间停顿的原因(如:线程间死锁,死循环,请求外部资源导致线程长时间等待等等是导致线程长时间停顿的常见原因);
案例说明:
使用案例:
第一步:jps -v 获取进车id
第二步:jstack -ml pid 1>/data/logs/test.core输出core文件
第三步:ps -T -p pid 查看某个进程中的线程
7、VisualVM 工具
注意:
在JDK 1.5之后,在Client模式下的虚拟机加入并且自动开启了类共享——这是一
个在多虚拟机进程中共享rt.jar中类数据以提高加载速度和节省内存的优化,而根据相关Bug
报告的反映,VisualVM的Profiler功能可能会因为类共享而导致被监视的应用程序崩溃,所以
读者进行Profiling前,最好在被监视程序中使用-Xshare:off参数来关闭类共享优化。
插件下载地址:
https://visualvm.github.io/archive/uc/8u40/updates.html
Linux tomcat8配置jmx:
1.编辑tomcat/bin/catalina.sh 找到如下位置:
在Execute The Requested Command前加入如下代码:
CATALINA_OPTS="$CATALINA_OPTS-Djava.rmi.server.hostname=10.12.116.135 -Dcom.sun.management.jmxremote-Dcom.sun.management.jmxremote.port=8088-Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.management.jmxremote.authenticate=true"
2.编辑jmxremote.access和jmxremote.password
进入系统安装jdk目录,例如:文件默认在该目录下:/data/jdk1.8.0_45/jre/lib/management
cpjmxremote.password.template jmxremote.password
Vim jmxremote.password
修改内容如下:
编辑最后的账户密码,去掉注释,密码改下别用默认的:
#Following are two commented-out entries. The "measureRole" role has
# password "QED". The"controlRole" role has password "R&D".
#
monitorRole QEDworld
controlRole R&Dhello
把文件改为运行tomcat 的用户,如果已经是,则不需要修改
修改文件权限600,这是Java的规范,防止别的用户看到你密码
命名:chmod600 jmxremote.access jmxremote.password
3. 重新启动 tomcat
VisualVM通过JMX访问远程连接不了的问题 ,关闭防火墙即可解决。
原因如下:
虽然已经对主监听端口设置了允许访问,但是随机端口号是Java进程启动后,OS随机分配给jmxserver的,如果不关闭防火墙,就必须在每次server就绪后,检测一下随机端口,然后设置为允许访问。
第一步:lsof -i:port插线监听该端口的进程号,也就是需要监听的java进程号
第二步:lsof -i|grep pid 查看jmx自动分配的监听端口
第三步:将jmx自动分配的端口添加到防火墙中(或者直接关闭防火墙)