一、Linux 本地无界面监控:
1、使用 jmap 监控 java 对象数量增长:
jmap -histo:live ${pid} | grep ${className}
watch -d -n 60 'jmap -histo:live ${pid} | grep ${className} | tee -a watch_jmap.log'
2、 使用 watch 持续监控进程资源使用情况并输出到文件
每分钟记录一次进程资源使用情况,参数为 pid:
watch -d -n 60 'top -o %MEM -b -n 1 | grep 16515 | tee -a watch_mem.log'
3、 使用 watch 持续监控进程资源使用情况,过滤内容并输出到文件
编写脚本(vim watch_top.sh
):
top -o %MEM -b -n 1 | grep "$1"| awk 'NR==1 {print " PID: "$1" \t MEM: "$6" \t %CPU: "$9"% \t %MEM: "$10"% \t TIME+: "$11" \t" strftime("%Y-%m-%d %H:%M:%S") }' | tee -a top_mem_"$1".log
每分钟记录一次进程资源使用情况,参数为 pid:
watch -d -n 60 ./watch_top.sh PID
4、查看进程启动时间以及运行时间
ps -eo pid,lstart,etime|grep 16515
二、jvm 远程监控
1、使用 JMX 远程监控
服务端:
服务端 jvm 启动时需要添加参数:
com.sun.management.jmxremote
:开启 jmx 远程监控;com.sun.management.jmxremote.port=port
:指定开启 JMX/RMI 连接的端口;除了发布用于本地访问的 RMI 连接器之外,设置这个属性,还会在私有的只读注册表发布一个额外的 RMI 连接器,这个连接器运行在 port 端口,使用jmxrmi
;com.sun.management.jmxremote.authenticate=false
:关闭安全认证;com.sun.management.jmxremote.ssl
:关闭 SSL;java.rmi.server.hostname
:主机名,远程连接时,需要通过该主机名建立连接。默认为 localhost。
set JMX_OPTS=-Dcom.sun.management.jmxremote
set JMX_OPTS=%JMX_OPTS% -Dcom.sun.management.jmxremote.port=8888
set JMX_OPTS=%JMX_OPTS% -Dcom.sun.management.jmxremote.authenticate=false
set JMX_OPTS=%JMX_OPTS% -Dcom.sun.management.jmxremote.ssl=false
set JMX_OPTS=%JMX_OPTS% -Djava.rmi.server.hostname=192.168.1.2
set CLASSPATH=test.jar
java %JMX_OPTS% -classpath %CLASSPATH% org.example.StartUp
即:
java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8888 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=192.168.1.2 -classpath test.jar org.example.StartUp
可以通过 jps + jinfo 查看是否生效:
~$ jps
20308
22932 AgentLauncher
3428 StartUp
7780 RemoteMavenServer36
15368 test.jar
19848 Bootstrap
23548 Jps
:~$ jinfo -flags 3428
Attaching to process ID 3428, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.271-b09
Non-default VM flags: -XX:CICompilerCount=12 -XX:InitialHeapSize=536870912 -XX:+ManagementServer -XX:MaxHeapSize=8575254528 -XX:MaxNewSize=2858418176 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=178782208 -XX:OldSize=358088704 -XX:+UnlockCommercialFeatures -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
Command line: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=192.168.1.2
客户端:
使用 JVisualVM 连接(也可以使用 jconsole )。
右键 Remote 添加远程主机:
填入 java.rmi.server.hostname 指定的 ip:
右键添加的远程主机,添加 JMX 连接:
填写 com.sun.management.jmxremote.port 指定的端口号:
效果如下:
2、通过 jstatd 连接
三、参考
命令说明:
参考文档: