VisualVM工具介绍

#VisualVM
VisualVM是一个以监控、显示本地或者远程服务器 JVM工作情况,进行性能调优的工具。借助VisualVM,我们可以实现对JVM内存各个子池、CPU、垃圾收集器等方面进行监控,从而发现程序代码中潜在的泄露点和配置问题。

VisualVM是一个Java编写的绿色软件,属于开源范畴。VisualVM是使用插件Plugin的方式提供功能,默认提供了一些基本检测功能。如果需要进行拓展,可以使用下载插件的功能进行。

运行展示

VisualVM工具介绍_第1张图片
其中,左侧是显示本地和服务器上正在运行的不同进程。双击后可对其进行详细分析。
其中包括但不仅限于:

  • CPU使用情况分析
  • 堆空间使用情况
  • 线程运行状况分析(运行、休眠、等待、驻留等情况)
  • 性能分析(Profiler)
  • GC调用情况分析(Eden/Old gen使用情况)

软件安装

VisualVM是安装在客户端上的软件,如果需要分析远程服务器的话只需要在服务器端启动jstatd进程或者注册JMX服务即可进行分析。

安装地址:Visual Download。

安装时请注意自己的JDK版本是否符合要求。

软件安装成功后即可对本机进程进行监视,分析。可以在 工具->插件 中添加你需要的插件。
VisualVM工具介绍_第2张图片

远程服务器连接

VisualVM使用jstatd进程或JMX与远程服务器连接。连接方式如下:

jstatd

jstatd是一个监控 JVM 从创建到销毁过程中资源占用情况并提供远程监控接口的 RMI ( Remote Method Invocation ,远程方法调用)服务器程序,它是一个 Daemon 程序,要保证远程监控软件连接到本地的话需要 jstatd 始终保持运行。

进入服务器中,使用命令jstatd,会出现以下错误

Could not create remote object
access denied ("java.util.PropertyPermission" "java.rmi.server.ignoreSubClasses" "write")
java.security.AccessControlException: access denied ("java.util.PropertyPermission" "java.rmi.server.ignoreSubClasses" "write")
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:372)
    at java.security.AccessController.checkPermission(AccessController.java:559)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
    at java.lang.System.setProperty(System.java:783)
    at sun.tools.jstatd.Jstatd.main(Jstatd.java:139)

解决方法为建立一个文件jstatd.all.policy,文件内容为

grant codebase "file:${java.home}/../lib/tools.jar" {
    permission java.security.AllPermission;
};

内容含义为给tools.jar文件增加安全权限。增加的安全权限为原有的java安全权限(也就是权限不变)。

然后在服务器中使用命令jstatd -J-Djava.security.policy=jstatd.all.policy

**注意:**jstatd.all.policy应为绝对路径或者此文件在当前目录中,默认开启1099端口。启动此进程会将console阻塞,可采取screen命令将其放入后台执行。

VisualVM工具介绍_第3张图片

点击添加jstatd连接,输入服务器ip,默认端口为1099,应与服务器端保持一致。这样就可以看到服务器端的java进程了。

如果还是没看到

查看/etc/hosts是否存在127.0.0.1的地址映射。如果存在,将其全部改成服务器的ip地址即可(别忘了重启jstatd)。

采取此种方法,只能在查看服务器端进程的堆空间信息,不能查看CPU相关信息。如果需要查看,则需要在服务器端绑定JMX

JMX

JMX: Java Management Extensions ,即 Java 管理扩展 , 是一个为应用程序、设备、系统等植入管理功能的框架。

可以增加JVM参数

-Dcom.sun.management.jmxremote.port=8999 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false

注:

  1. -Dcom.sun.management.jmxremote.port :这个是配置远程 connection 的端口号的,要确定这个端口没有被占用
  2. -Dcom.sun.management.jmxremote.ssl=false 指定了 JMX 是否启用 ssl
  3. -Dcom.sun.management.jmxremote.authenticate=false 指定了JMX 是否启用鉴权(需要用户名,密码鉴权)
    2,3两个是固定配置,是 JMX 的远程服务权限的

修改方法

  • J2EE

如果你要在J2EE环境中配置这些参数,那么你需要在J2EE应用服务器或者Servlet容器相关启动参数设置处指定,其启动文件中来配置,Tomcat是在catalina.sh中配置。

  • 运行java类

直接将以上参数加入命令中
eg:

java -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar myJob.jar
  • 运行Hadoop

在mapred-site.xml配置文件里面有个mapred.child.java.opts配置,可以用来指定JVM参数。详情请参考

http://www.iteblog.com/archives/981

运行后就可以进行查看远程服务器上的进程的运行情况了。

VisualVM工具介绍_第4张图片

不过注意要在测试之后将这些配置删除哦。会影响性能,给黑客攻击留下后门的。

【参考资料】

http://ihuangweiwei.iteye.com/blog/1219302

http://blog.itpub.net/17203031/viewspace-765810/

你可能感兴趣的:(科普)