性能调优1-工具

来源:互联网 发布:便携式医用冷藏箱知乎 编辑:程序博客网 时间:2024/05/29 16:30

一,jstack(linux下特有)

可以观察到jvm中当前所有线程的运行情况和线程当前状态

1. 抓取分析文件的用法是:/usr/java/jdk1.6.0_13/bin/jstack -l 11831(其中11831是当前的java进程,这个需要自己ps看)

 

2. 抓到的文件内容大概是下面这个样子:

 

2010-03-18 13:09:52Full thread dump Java HotSpot(TM) 64-Bit Server VM (11.3-b02 mixed mode):"Attach Listener" daemon prio=10 tid=0x00002aab41d02c00 nid=0x748b waiting on condition [0x0000000000000000..0x0000000000000000]   java.lang.Thread.State: RUNNABLE   Locked ownable synchronizers:- None"SocketAcceptorIoProcessor-0.4" prio=10 tid=0x00002aab3e586800 nid=0x6a71 runnable [0x000000004234b000..0x000000004234bd20]   java.lang.Thread.State: RUNNABLEat sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:215)at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:65)at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:69)- locked <0x00002aaab6c85770> (a sun.nio.ch.Util$1)- locked <0x00002aaab6c85788> (a java.util.Collections$UnmodifiableSet)- locked <0x00002aaab6c856f8> (a sun.nio.ch.EPollSelectorImpl)at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:80)at org.apache.mina.transport.socket.nio.SocketIoProcessor$Worker.run(SocketIoProcessor.java:480)at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:51)at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)at java.lang.Thread.run(Thread.java:619)   Locked ownable synchronizers:- <0x00002aaab6c84ed0> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)

 

3.可以看出的问题:

   其实打出来的内容不是很好,但是如果同一个方法在输出内出现多次,或者是locked某些资源,就可以初步判定一下问题。

 

 

 

二。 jmap(linux下特有(推荐!)

1.观察运行中的jvm物理内存的占用情况。参数如下:

-heap:打印jvm heap的情况
-histo:打印jvm heap的直方图。其输出信息包括类名,对象数量,对象占用大小。
-histo:live :同上,但是只答应存活对象的情况
-permstat:打印permanent generation heap情况

 

2.用法:

jmap -J-d64 -dump:live,format=b,file=heap_dump.bin 15605

通常会将jmap的信息重定向输出到文件,然后使用工具来分析:) 比如MemoryAnalyzer这个非常牛的工具,

 

MemoryAnalyzer视图:这个视图还是比较强大的,会分析出最有可能泄露的4-5个根源,可以看到系统全部对象的资源。



 

 

 

。。oql,对象查询,,说实话不太会用。。但是掌握了估计用处很大,jhat也是支持这种查找的。

 

 

DB连接池泄露分析(还是这种gui的搜索方式比较对胃口),直接找一下connection,看看个数是不是接近pool.size上限,然后进去分析每个连接资源