本地监控
JConsole,JvisualVM工具可以直观监控Tomcat的JVM内存、线程、GC等信息。
Windows本地监控很简单,Linux可以借助Linux的远程图形桌面VNC。
VNC操作如下:
1.Linux上安装VNC服务端:
l yum install tigervnc-server
# yum groupinstall "GNOME Desktop Environment"(CentOS 5.x安装GNOME桌面环境)
# yum groupinstall "X Window System" "Desktop"(CentOS 6.x安装GNOME桌面环境)
# yum groupinstall Xfce(CentOS安装Xfce桌面环境,可选)
# yum install vnc-server vnc* (CentOS 5.x里)
# yum install tigervnc-server tigervnc (CentOS 6.x里)
l 把远程桌面的用户加入到配置文件中
vi /etc/sysconfigvncservers
使用vi编辑器打开配置文件,在文件中添加下面两行命令
VNCSERVERS="1:root" --指定远程用户
VNCSERVERARGS[1]="-geometry 1024x768" --指定远程桌面分辨率
l 给远程桌面用户 root 设置密码:vncpasswd
l 开启VNC端口。iptables防火墙默认会阻止vnc远程桌面,所以需要在iptables允许通过。当你启动vnc服务后,你可以用netstat -tunlp命令来查看vnc服务所使用的端口。使用下面命令开启这些端口:
vi /etc/sysconfig/iptables
使用vi编辑器打开配置文件,在文件中添加下面一行命令
-A RH-Firewall-l-INPUT -p tcp -m tcp --dport 5900:5903 -j ACCEPT
l 重启防火墙:
/etc/init.d/iptables restart
或者直接关闭防火墙:
/etc/init.d/iptables stop
l 启动vncserver:vncserver
2.VNC客户端:
在vnc客户端中输入:服务器端IP:1 ,然后输入密码。打开JConsole,JvisualVM工具就能直观看到监控信息了。
远程监控
这里再介绍下如何利用JConsole进行远程监控Tomcat, JvisualVM类似。因为比较耗性能,一般在进行性能测试时不推荐使用。
1.参数配置:
Linux下,tomcat bin/catalina.sh配置:
JAVA_OPTS=”-Xms2048m -Xmx2048m-XX:MaxPermSize=516m -Djava.rmi.server.hostname=192.168.77.159-Dcom.sun.management.jmxremote.port=1090-Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.management.jmxremote.authenticate=false”
windows下,tomcat bin/catalina.bat配置:
set JAVA_OPTS=%JAVA_OPTS%-Xms2048m -Xmx2048m -XX:MaxPermSize=516m -Djava.rmi.server.hostname=192.168.77.159-Dcom.sun.management.jmxremote.port=1090-Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.management.jmxremote.authenticate=false
注意事项:确保指定的端口不被占用,windows下使用netstat -aon|findstr "1090"查看端口是否被占用,另外如果开启了防火墙服务,请确保端口能够透过防火墙访问;
2.连接远程虚拟机,启动%JAVA_HOME%\bin目录下的jconsole,输入相关ip和port,建立连接
使用命令
有时进行现网性能测试时,可能安装软件或添加jvm远程监控相关参数都很不方便。这时我们可以选择一些jdk自带的监控工具。
jps
查看所有的jvm进程,包括进程ID,进程启动的路径等等。
示例:jps -v
也可以用ps:ps -ef |grep java
jstack
观察jvm中当前所有线程的运行情况和线程当前状态。
注意:在实际运行中,往往一次 dump的信息,还不足以确认问题。建议产生三次 dump信息,如果每次 dump都指向同一个问题,我们才确定问题的典型性。
示例threaddump: jstack -l 2203 > threaddump_1.txt
threaddump文件可以用IBM的一个线程分析工具进行分析。
dump 文件里,值得关注的线程状态有:
死锁, Deadlock
等待资源, Waiting on condition
等待获取监视器, Waiting on monitor entry
阻塞, Blocked
jstat
jstat利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对进程的classloader,compiler,gc情况。
示例:jstat –gccause –h 15 2203 2000
参数介绍:
-class:统计class loader行为信息
-compile:统计编译行为信息
-gc:统计jdk gc时heap信息
-gccapacity:统计不同的generations(包括新生区,老年区,permanent区)相应的heap容量情况
-gccause:统计gc的情况,(同-gcutil)和引起gc的事件
-gcnew:统计gc时,新生代的情况
-gcnewcapacity:统计gc时,新生代heap容量
-gcold:统计gc时,老年区的情况
-gcoldcapacity:统计gc时,老年区heap容量
-gcpermcapacity:统计gc时,permanent区heap容量
-gcutil:统计gc时,heap情况
jmap
监视进程运行中的jvm物理内存的占用情况,该进程内存内所有对象的情况,例如产生了哪些对象,对象数量等。
注意:这个jmap使用的时候jvm是处在假死状态的,只能在服务瘫痪的时候为了解决问题来使用,否则会造成服务中断。
1-默认视图
查看连接到进程里的本地类库。jmap [pid]
2-堆视图
堆大小是年轻代、年老代加上PermGen区总和。年轻代包括Eden,S0,S1。
jmap–heap [pid]
3-柱状视图
使用柱状视图可以看到哪些对象占用了内存。
jmap–histo [pid] | head -30
jmap使用类型内部名称。如:字符数组会写成 [C 。
B byte
C char
D double
F float
S short
I int
J long
Z boolean
[ 数组,如[I表示int[]
[L+类名其他对象
[C is a char[]
[S is a short[]
[I is a int[]
[B is a byte[]
[[I is a int[][]
带上live,表示只统计存活对象
jmap -histo:live 9939 | head -30
4-生成dump文件
产生一个HeapDump文件,此为生成heapdump文件的重要参数。
例: jmap -dump:format=b,file=0612-hd_drlgz-v50.hprof 50515
可以使用MAT和IBM的一个内存分析工具分析导出的内存文件。
jinfo
观察进程运行环境参数,包括Java System属性和JVM命令行参数。
参考网址
https://my.oschina.net/freegarden/blog/286372