项目开发过程中,java 的内存和性能 可能由于业务开发时的一些不规范或没留意 而引起问题,这时候,jvm的查看工具就非常有必要了!
本章介绍部分工具用到留存
分析的时候,可以有以下几种:
linux上的工具
http://blog.csdn.net/mingover/article/details/55048905
* 查看内存,cpu等:
top,free..
当遇到java进程内存过大,则是否有泄露?或是否没有设置好Xms Xmx PermSize MaxPermSize
或者cpu一直近100%时,查看java控制台日志,1、如果只是很慢,应该是有瓶颈,比如,数据库有慢查询,业务一直积压。2、如果是内存爆了,则会抛出outofmemory 的错误,针对这个错误来改正
* 查看网络
iftop 能看到总流量和与外部ip的流量情况,如果出现总流量过大,要考虑是攻击,还是文件传输,是否需要提高带宽
netstat -n | awk ‘/^tcp/ {++s[$NF]} END {for(a in s) print a,s[a]}’ 查看连接,如果异常,可能是java代码里的 http请求等没有关.
* 查看硬盘
查看当前文件夹的容量du -h –max-depth=1
查看总体容量 df -h
* 其它
ps 查看进程
ps aux | grep ‘java’ | grep -v ‘grep’
jvm的查看工具
jvm 的工具都在%JAVA_HOME%/bin下面
* jstat
这个命令对于查看Jvm的堆栈信息很有用。能够查看eden,survivor,old,perm等heap的capacity,utility信息
对于查看系统是不是有能存泄漏以及参数设置是否合理有不错的意义
jstat -gcutil 25769 5000 5
YGC, 还好,FGC 要小一点
如果发现 FGC 非常频繁,或 O 长期在90,那一空是有问题的,说明内存不足或内存泄露。
显示加载class的数量,及所占空间等信息。
jstat -class 675
显示VM实时编译的数量等信息。
jstat -compiler 675
jmap
这个是用来查看jvm当前的heap dump的。可以看出当前jvm中各种对象的数量,所占空间等等。尤其值得一提的是这个命令可以到处一份binary heap dump的bin文件,这个文件能够直接用Eclipse Memory Anayliser来分析,并找出潜在的内存泄漏的地方。查看heap 的总体情况
jmap -heap 4650导出java进程的dump,它保存了某一时刻JVM堆中对象使用情况,这种文件需要相应的工具进行分析,如IBM Heap Analyzer这类工具。这类文件最重要的作用就是分析系统中是否存在内存溢出的情况
jmap -dump:format=b,file=dump.bin 79609
导出的dump 可以用分析工具分析,对outofmemory的原因查找非常有用!jmap -histo 进程号 类的实例
dgm@iZ28gy61tjeZ:~$ jmap -histo 4650 | more
num #instances #bytes class name
----------------------------------------------
1: 444776 29413056 [C
2: 141220 21445696 <constMethodKlass>
3: 25720 18517544 [I
4: 141220 18089120 <methodKlass>
5: 15200 17027832 <constantPoolKlass>
6: 98745 13232872 [B
7: 15200 10685944 <instanceKlassKlass>
jstack(查看线程
这个是用来查看jvm当前的thread dump的。可以看到当前Jvm里面的线程状况,对于查找blocked线程比较有意义
jstack 29483> 1.txt (打印出进程号29483的实时线程,存放到1.txt),主要保存的是Java应用各线程在某一时刻的运行的位置,即JVM执行到哪一个类、哪一个方法、哪一个行上。它是一个文本文件,打开后可以看到每一个线程的执行栈,以stack trace的显示。通过对JavaCore文件的分析可以得到应用是否“卡”在某一点上,即在某一点运行的时间太长,例如数据库查询,长期得不到响应,最终导致系统崩溃等情况。jstack 22291| grep java.lang.Thread| wc -l //看一下线程数
jvm的分析工具
MemoryAnalyzer
一个eclipse 的插件,直接使用,把dump,open即可
MAP的安装:
MAT :Eclipse 内存分析工具:http://www.eclipse.org/mat
使用MAT可以加载上面jmap 生成的dump.bin,打开,即可查看到内容,里面会自己找到 leak suspects , 很有可能,系统的问题就在这里可以找到,其它功能,请自行查找。jhat(较少用)
//下面这个命令会启动一个server,把heap.bin信息通过服务器的7000端口表现,
jhat -stack false -refs false -J-Xmx2g /path/to/heap/dump/heap.bin
参考:http://blog.csdn.net/gtuu0123/article/details/6039474
jvm的参数调整
关于jvm的各种参数,请参考(各版本可能会不太一样:
http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
介绍几个参数
gc的相关信息,如果对gc有疑问,可以参考:
-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails
-Xloggc:E:/study-data/java/jvm/test_data/1/gc.log
-XX:+DisableExplicitGC
会打印出下面这样的 gc过程:
----------------------------------------------------------------------------------------------
95.662: [GC 95.663: [DefNew: 14829K ->1219K(15296K), 0.0210302 secs] 215278K ->201825K(218496K), 0.0213182 secs]
开户的时间 表示是一个GC 新生代 : 原来这么大->回收后 (新生代总大小) 时间 ] 堆回收前大小 ->回收后 (堆总大小), 时间
96.080: [GC 96.080: [DefNew: 14851K->1246K(15296K), 0.0199443 secs] 215457K->201876K(218496K), 0.0202279 secs]
96.496: [GC 96.496: [DefNew: 14878K->1664K(15296K), 0.0229823 secs] 215508K->202632K(218496K), 0.0232672 secs]
96.852: [GC 96.852: [DefNew: 15296K->1460K(15296K), 0.0270884 secs] 216264K->202902K(218496K), 0.0273640 secs]
97.313: [GC 97.313: [DefNew: 15092K->1254K(15296K), 0.0209981 secs] 216534K->203138K(218496K), 0.0212806 secs]
97.698: [GC 97.698: [DefNew: 14886K->1166K(15296K), 0.0208969 secs] 216770K->203170K(218496K), 0.0211452 secs]
98.179: [GC 98.179: [DefNew: 14798K->958K(15296K), 0.0156368 secs] 216802K->203040K(218496K), 0.0159253 secs]
98.618: [GC 98.618: [DefNew: 14590K->1154K(15296K), 0.0181615 secs] 216672K->203322K(218496K), 0.0184358 secs]
98.976: [GC 98.976: [DefNew: 14786K->1492K(15296K), 0.0192640 secs] 216954K->203868K(218496K), 0.0195322 secs]
99.306: [GC 99.306: [DefNew: 15124K->1223K(15296K), 0.0182786 secs] 217500K->203859K(218496K), 0.0185537 secs]
99.685: [GC 99.686: [DefNew: 14855K->1329K(15296K), 0.0211104 secs] 217491K->204352K(218496K), 0.0213851 secs]
100.074: [GC 100.074: [DefNew: 14961K->1162K(15296K), 0.0191238 secs]100.094: [Tenured: 203340K->145624K(203456K), 2.1756063 secs] 217984K->145624K(218752K), 2.1958240 secs]
.....................................................................................................................................................................................[老年代 : ............................................(老年代总大小)..........................] 堆 ..............
102.963: [GC 102.964: [DefNew: 16320K->1481K(18304K), 0.0283947 secs] 161944K->147105K(261016K), 0.0286427 secs]
103.640: [GC 103.641: [DefNew: 17801K->148K(18304K), 0.0105161 secs] 163425K->146202K(261016K), 0.0107641 secs]
103.721: [GC 103.721: [DefNew: 16429K->197K(18304K), 0.0063630 secs] 162483K->146251K(261016K), 0.0065789 secs]
111.478: [Full GC 111.479: [Tenured: 146053K->129078K(242712K), 1.6887352 secs] 158242K->129078K(261016K), [Perm : 44872K->44872K(131072K)], 1.6890293 secs]
.....................full GC ......................................................................................................................................................................................................................[永久代:...................................
215.721: [Full GC 215.721: [Tenured: 129078K->116901K(242712K), 1.9349399 secs] 129378K->116901K(261016K), [Perm : 44874K->43827K(131072K)], 1.9352304 secs]
335.040: [Full GC 335.040: [Tenured: 116901K->116901K(242712K), 1.5403616 secs] 117197K->116901K(261016K), [Perm : 43827K->43827K(131072K)], 1.5409564 secs]
429.055: [Full GC 429.055: [Tenured: 116901K->116902K(242712K), 1.4874724 secs] 117945K->116902K(261016K), [Perm : 43827K->43827K(131072K)], 1.4877552 secs]
519.374: [Full GC 519.375: [Tenured: 116902K->116902K(242712K), 1.3900910 secs] 117136K->116902K(261016K), [Perm : 43827K->43827K(131072K)], 1.3903904 secs]
----------------------------------------------------------------------------------------------
服务器上建议设置以下的参数
-XX:MaxPermSize
-Xms
-Xmx
如
-Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M
参考:
http://wiki.eclipse.org/index.php/MemoryAnalyzer
http://seanhe.iteye.com/blog/898277
https://www.ibm.com/developerworks/cn/java/j-memoryanalyzer/
http://outofmemory.cn/c/java-outOfMemoryError
jvm:https://www.amazon.cn/dp/B00D2ID4PK/ref=sr_1_1?ie=UTF8&qid=1487082193&sr=8-1&keywords=jvm%E8%99%9A%E6%8B%9F%E6%9C%BA
jstack:http://jameswxx.iteye.com/blog/1041173
一些代码规范:http://1311321.blog.51cto.com/1301321/568517