JDK裏有三個很好用的工具,jmap,jconsole和jvisualvm,三個工具都各有所側重,可是若是你的系統遇到性能瓶頸(內存不足或是CPU佔用率太高),你能夠經過這三個工具來發現應用裏的hot spot。我今天只記一下大概的用法,給本身作個備忘,詳細的使用說明,等忙完了這段時間,整理一下。html
先介紹一個小工具,jps,這也是jdk自帶的工具之一,能夠列出系統裏全部的java進程。java
jmap能夠查看程序中堆的使用狀況,具體的用法是:工具
jmap –histo:live <pid>;性能
以及能夠將堆dump到一個文件,命令是:spa
jmap –dump:format=b,file=heap.bin <pid>;線程
請在<pid>處填入相應的進程的id。code
jconsole能夠查看某個java進程的內存使用、CPU佔用率等,orm
若是想要遠程查看某一java程序,則須要在該程序啓動參數里加下以下參數:htm
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9001
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false進程
上文使用的9001是監聽的端口號,你能夠指定其餘的值。而後在你的終端鍵入jconsole,選擇鏈接遠程進程,並填入相應的主機名和端口便可。若是沒法鏈接,請修改/etc/hosts裏的內容,將localhost綁定到機器的外部ip地址。
相應的數據能夠導出爲一個csv文件,這個很方便。
jvisualvm功能與jconsole的基本相似,可是能夠作性能分析。
便可以分析出CPU時間被哪些線程所佔用了,等等,而且它支持jmx,這東西我只據說過沒用過,先放一邊不表。
配置jvisualvm不須要改動原程序的啓動參數,只須要在遠程主機上運行jstatd便可。
新建一個叫jstatd.all.policy的文件,內容是:
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
而後使用以下命令啓動jstatd,
jstatd -J-Djava.security.policy=jstatd.all.policy
而後在
jvisualvm裏選擇添加遠程主機便可。若是沒法鏈接,請修改/etc/hosts裏的內容,將localhost綁定到機器的外部ip地址。