#VisualVM
VisualVM是一个以监控、显示本地或者远程服务器 JVM工作情况,进行性能调优的工具。借助VisualVM,我们可以实现对JVM内存各个子池、CPU、垃圾收集器等方面进行监控,从而发现程序代码中潜在的泄露点和配置问题。
VisualVM是一个Java编写的绿色软件,属于开源范畴。VisualVM是使用插件Plugin的方式提供功能,默认提供了一些基本检测功能。如果需要进行拓展,可以使用下载插件的功能进行。
其中,左侧是显示本地和服务器上正在运行的不同进程。双击后可对其进行详细分析。
其中包括但不仅限于:
VisualVM是安装在客户端上的软件,如果需要分析远程服务器的话只需要在服务器端启动jstatd进程或者注册JMX服务即可进行分析。
安装地址:Visual Download。
安装时请注意自己的JDK版本是否符合要求。
软件安装成功后即可对本机进程进行监视,分析。可以在 工具->插件
中添加你需要的插件。
VisualVM使用jstatd进程或JMX与远程服务器连接。连接方式如下:
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
命令将其放入后台执行。
点击添加jstatd连接,输入服务器ip,默认端口为1099,应与服务器端保持一致。这样就可以看到服务器端的java进程了。
如果还是没看到
查看/etc/hosts
是否存在127.0.0.1的地址映射。如果存在,将其全部改成服务器的ip地址即可(别忘了重启jstatd)。
采取此种方法,只能在查看服务器端进程的堆空间信息,不能查看CPU相关信息。如果需要查看,则需要在服务器端绑定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
注:
- -Dcom.sun.management.jmxremote.port :这个是配置远程 connection 的端口号的,要确定这个端口没有被占用
- -Dcom.sun.management.jmxremote.ssl=false 指定了 JMX 是否启用 ssl
- -Dcom.sun.management.jmxremote.authenticate=false 指定了JMX 是否启用鉴权(需要用户名,密码鉴权)
2,3两个是固定配置,是 JMX 的远程服务权限的
修改方法
如果你要在J2EE环境中配置这些参数,那么你需要在J2EE应用服务器或者Servlet容器相关启动参数设置处指定,其启动文件中来配置,Tomcat是在catalina.sh中配置。
直接将以上参数加入命令中
eg:
java -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar myJob.jar
在mapred-site.xml配置文件里面有个mapred.child.java.opts配置,可以用来指定JVM参数。详情请参考
http://www.iteblog.com/archives/981
运行后就可以进行查看远程服务器上的进程的运行情况了。
不过注意要在测试之后将这些配置删除哦。会影响性能,给黑客攻击留下后门的。
【参考资料】
http://ihuangweiwei.iteye.com/blog/1219302
http://blog.itpub.net/17203031/viewspace-765810/