随笔 - 1, 文章 - 0, 评论 - 4, 引用 - 0
数据加载中……

【讨论】关于Java性能监控的一些记录

    本篇所有内容都是基于JDK5,如使用JDK6会有差别。
    在前些日子,我们做了一些性能监控的工作,有一些值得记录的地方:
    JDK自身提供了很多工具,基于命令行和GUI的都有,学会合理应用它们是很有用处的。
    首先是jmap,这是一个命令行程序,用来查看JVM中对象数量情况,直接输入jmap会显示用法,下面是两个常用的功能:
jmap -histo 'jvmPid' > memory.txt
   
    其中jvmPid为当前虚拟机进程的系统ID号,等待过后,memory.txt会按空间占用由大到小的顺序保存当前虚拟机运行中存在的对象类型,我们可以由此看出哪些类型对象占的空间和生成的数目较多,尤其是在自定义对象出现问题导致不能及时回收,这个功能是很有用的。
jmap -heap:format='jvmPid'

    和上面的不同,上面是生成一个文本文件,而这里会生成一个二进制快照文件,可以用相应的分析软件来打开它来进行功能更全面的检测,如Eclipse Memory Analyzer。
    需要注意的是,上面的导出快照命令,在1G左右JVM内存的情况下,要大概等待1分钟左右的时间,且执行时会使JVM暂停执行,因此不要在正式运行系统的高峰期或关键时刻使用。
    接下来是jstat,这也是一个命令行程序,用来查看JVM的各个内存和GC的使用情况,用法和参数非常多,有两个我们用到的功能:
jstat -gcutil 'jvmPid'

    会显示此刻GC的情况,其中YGC和FGC代表小GC和大GC的次数,YGCT和FGCT则代表小GC和大GC运行的占用时间,正常情况下,大GC的次数应远远小于小GC,例如我当前的系统小GC已经有10w次,而大GC只有50次,这是程序设计运行良好的表现。
jstat -gccapacity 'jvmPid'

    会显示此刻GC各内存池占用量,和上条命令结果结构类似,同时也有一个问题,显示的数据不是很直观,如果通过GUI观看就好多了。

    JVM自带了GUI监控状态的功能,在JDK5中,我们需要做一些配置手动开启它,首先我们要在JVM启动项增加一些属性,假设我们的系统是一个运行在tomcat容器下的项目,我们就可以修改JAVA_OPTS变量来开启监控服务
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=false"

    这将开启远程基于jmx监控的服务功能,这样的配置方式,同时也开启了默认的身份验证机制,我们还需要在另外的地方设置权限,用户名和密码才能登录,我们先把这些服务端剩下的工作搁置一旁,先说说客户端的部分。

    我们需要GUI客户端访问工具来远程查看该虚拟机的信息,JDK5自带了一个名为jconsole的客户端,可以在JDK目录的bin文件夹下找到它并可以直接双击运行,点击“远程”标签,之后输入远程IP,端口,用户名和密码,如服务端配置正常,即可成功访问。

    回到服务端上来,我们还需要配置JVM的远程用户名和密码,这个要修改$JAVA_HOME/jre/lib/management/jmxremote.access和jmxremote.password.template文件。

    首先直接修改jmxremote.access文件,取消最后两个用户名的注释,改为
monitorRole   readonly
controlRole   readwrite \
              create javax.management.monitor.
*,javax.management.timer.* \
              unregister

    这两个用户的区别显而易见,你取消一个当然也可以。
    然后修改jmxremote.password.template的文件名,将改成jmxremote.password,之后同样编辑最后两行用户,将密码改成你想要的,很简单吧。
    之后还要做一步,将jmxremote.password文件的权限改为可读可写
chmod 600 $JAVA_HOME/jre/lib/management/jmxremote.password

    至此,还有最后一点需要注意,要将/etc/hosts文件中127.0.0.1修改成你真正的外网IP,如210.209.83.37,并且运行 hostname -i命令返回的IP也应该是210.209.83.37才可以,每次修改完上述文件,要重新启动JVM,监控服务才会生效。
    大功告成,开启JVM以后,我们可以运行jconsole客户端,输入IP端口,用户名和密码,用户名为monitorRole或controlRole或你自定义的(权限不同)。
    也可以免去用户验证部分,只需要再加入-Dcom.sun.management.jmxremote.authenticate=false即可,也可以通过修改com.sun.management.jmxremote.password.file和 com.sun.management.jmxremote.access.file自定义权限文件和密码文件的位置,不过这也没有什么太大必要。
    成功登录后,因为是GUI界面,所有信息可以很直观的被我们所学习和接受,但还需要我们具备一些JVM的知识,尤其是GC方面,有机会的话,会在以后的文档中继续说明。

    PS:打个小广告,公司正在做OA项目,急缺人手,如果兄弟们谁有意向,发简历(huangcai36@163.com)给我。水平可以培养,但人要踏实!

posted on 2011-03-10 12:44 黄小彩 阅读(1785) 评论(4)  编辑  收藏

评论

# re: 【讨论】关于Java性能监控的一些记录[未登录]  回复  更多评论   

好文~收藏~
2011-03-10 19:00 | Bomber

# re: 【讨论】关于Java性能监控的一些记录[未登录]  回复  更多评论   

我们的OA快要上线了~~~
2011-03-14 12:45 | dd

# re: 【讨论】关于Java性能监控的一些记录  回复  更多评论   

不知贵公司的工作地点是哪里?
2011-03-19 13:18 | apl

# re: 【讨论】关于Java性能监控的一些记录  回复  更多评论   

@apl
工作地点在厦门,在上海及广州有分公司,如果您有意向,可以投一下简历。
2011-03-22 16:56 | 黄小彩

只有注册用户登录后才能发表评论。


网站导航: