使用JDK进行Performance Tuning

JDK里有三个很好用的工具,jmapjconsolejvisualvm,三个工具都各有所侧重,但是如果你的系统遇到性能瓶颈(内存不足或是CPU占用率过高),你可以通过这三个工具来发现应用里的hot spot。我今天只记一下大概的用法,给自己做个备忘,详细的使用说明,等忙完了这段时间,整理一下。

先介绍一个小工具,jps,这也是jdk自带的工具之一,可以列出系统里所有的java进程。

jmap可以查看程序中堆的使用情况,具体的用法是:

jmap –histo:live <pid>;

以及可以将堆dump到一个文件,命令是:

jmap –dump:format=b,file=heap.bin <pid>;

请在<pid>处填入相应的进程的id。

jconsole可以查看某个java进程的内存使用、CPU占用率等,

如果想要远程查看某一java程序,则需要在该程序启动参数里加下如下参数:

-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地址。

2010年4月12日 | 归档于 Java, Linux, 技术, 软件
  1. RednaxelaFX
    2010年4月13日 12:31 | #1

    话说JConsole和VisualVM都支持JMX的。JVM内建的JMX支持可以支持很多有趣的操作,应用程序也可以自定义一些管理功能插到里面去

    • 2010年4月17日 13:34 | #2

      是的,我也有看了一点点jmx的东西,但是现在手头上的活比较紧,所以就没有用。

发表评论

XHTML: 您可以使用这些标签: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">