java虚拟机自带了很多有效的工具的可以用于java项目监测调试。不过,在使用jvm自带的调试工具之前,必须得掌握linux下的调试指令。下面是一部分。
#切换linux命令行视图
screen -dr
#查看file文件的最后number行
tail -f number file
#df命令的功能是用来检查linux服务器的文件系统的磁盘空间占用情况
df -lh
#使用free命令看到系统实际使用内存的情况
free -h
#uptime查看系统负载
uptime
#ps -ef |grep java 找出最耗性能的JAVA进程
ps -ef | grep compliance
#kill -9强制关闭某个线程
kill -9 pid
#nohup 后台运行某个项目
nohup java -jar web-com-1.0-SNAPSHOT.jar > out.log 2>&1 &
#top指定查看PID,只查看某个或某些进程的信息
top -p 29529
#top,查看某个进程内部线程占用情况分析
top -H -p 18605
#grep -c:只输出匹配行的计数
grep -c "C.Notice.Queue" out.log
然后,是jvm虚拟机的工具
jps
与linux系统中ps的功能一样,主要用于支持进程相关的操作
jstat
可以使用 jstat -options查看jstat支持哪些命令,比较常用的是
C:\Users\chaoj>jstat -options
-class
-compiler
-gc
-gccapacity
-gccause
-gcmetacapacity
-gcnew
-gcnewcapacity
-gcold
-gcoldcapacity
-gcutil
-printcompilation
比较常见的用法是:
$ jstat -gcutil pid period
#获取pih进程的堆转储情况,period为间隔时间周期
jmap
# 生成一个类的统计报表,此表非常简单,如显示什么类有多少个实例
$ jmap -histo pid
# 获取java堆信息
$ jmap -heap pid
# 获取快照,将快照的结果交给 jhat进行处理
$ jmap -dump
jstack
获取java进程的栈信息
jconsole
打开了本地的java项目之后,然后打开jconsole连接到需要监测的项目,就可以进行监测了
jhat
jhat是分析工具,主要用来分析jmap dump下来的内存快照
jinfo
$ jinfo pid
#获取当前java pid项目所配置的jvm相关config
同时,可以使用jdk内置的visual vm对java项目进行监控,visual vm支持安装插件,只要在命令行中输入:
$ jvisualvm
就可以运行了。监测远程端口时,远程java的监听端口默认为1099端口。visual vm安装了visual GC插件之后,可以对项目的内存中的新生代老年代进行有效监测,分析内存泄漏时,用visual vm监测,当发现full GC很多且没有用的时候,可以确定的有两个可能性,第一是虚拟机开启参数-Xmx/-Xmn/-Xms等参数设置得有问题。这得根据项目中jvm使用的具体垃圾回收器进行讨论,不同的垃圾回收器有不同的处理手段。第二是可能发生了内存泄漏。可以优先考虑第二种情况,当老年代比较满的时候切换到抽样器中查看当前内存中对象的占比情况,如果发现了一些非通用对象比较多,那么内存泄漏大部分都是因为那些非通用对象的积压造成的,也就是所谓的内存泄漏。这时候就可以去研究一下源代码,看看是不是没有用的对象引用没有被释放掉,如果是,那么就采取措施把没用的对象引用释放掉,再测试是否会发生内存泄漏,如果仍然发生内存泄漏或者该对象的引用是释放掉了的,只不过需要的量本身就比较大,那么就有可能是内存中参数设置得有问题了。