1.简介
VisualVM是一种集成了多个JDK命令行工具的可视化工具,它能为您提供强大的分析能力。它囊括的命令行工具包括jstat, JConsole, jstack, jmap 和 jinfo,这些工具与JDK的标准版本是一致的。可以使用VisualVM生成和分析海量数据、跟踪内存泄漏、监控垃圾回收器、执行内存和CPU分析,
JVM常用内存查看工具 Jconsole,jProfile,VisualVM
1.Jconsole : jdk自带,功能简单,但是仅可以在系统有一定负荷的情况下使用。对垃圾回收算法有很详细的跟踪。官方文档:
2.JProfiler:商业软件,功能强大。官网地址:
3.VisualVM:JDK1.8之前自带(jvisualvm),JDK1.8以后脱离,可能是由于graalvm,官网地址:
2.下载及启动
下载地址:
window启动:
1.需要jdk1.8及更高版本,可修改配置文件中解压文件下etc/visualvm.conf 中的visualvm_jdkhome指定jdk版本;
2.双击visualvm.exe启动即可
VisualVM 所在的分区如果是NTFS格式,那么第一个问题就出现了:sun对NTFS格式的硬盘支持有问题!但可通过参数可避免,并完成启动。步骤如下:
- 创建一个visualvm.exe的快捷方式
- 在“目标”中添加如下参数 -XX:+PerfBypassFileSystemCheck
linux下
方法同上,不建议
界面介绍
主界面
应用说明
CPU 内存 线程 堆空间大小分配(年轻代、年老代、持久代分配) 类等的概况
应用内部的线程情况
3.使用说明
3.1 监听本地程序
本地的程序会自动识别在local目录下,双击对应的应用便可查看;
3.2 监听远端程序
3.2.1 监听程序
支持jstatd和JMX两部分
1.建立远程服务
2.输入地址,如下:
3.远程主机上启动jstatd
在远程服务器jdk 的bin目录下创建 jstatd.all.policy 文件
文件内容如下:(没有tools.jar)
Jdk11以前:
grant codebase "file:/usr/lib/jvm/java-1.8.0-openjdk-amd64/lib/tools.jar" {
permission java.security.AllPermission;
};
JDK11以后
grant codebase "jrt:/jdk.jstatd" {
permission java.security.AllPermission;
};
grant codebase "jrt:/jdk.internal.jvmstat" {
permission java.security.AllPermission;
};
4.启动
./jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=本地机器实际的IP地址 -p 端口 -J-Djava.rmi.server.logCalls=true &
5.查看是否启动
jps -l
6.Visualvm 配置
7.远程主机上启动jmx
JVM 参数中添加:
-Djava.rmi.server.hostname=192.168.1.105 -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.rmi.port=9999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
说明:
-Dcom.sun.management.jmxremote :允许使用JMX远程管理
-Dcom.sun.management.jmxremote.port=9008:JMX远程连接端口
-Dcom.sun.management.jmxremote.authenticate=false:不进行身份认证,任何用户都可以连接
-Dcom.sun.management.jmxremote.ssl=false :不使用ssl
3.2.2 服务器的监听配置
服务器的配置考虑安全需要使用用户名和密码连接
Tomcat
打开Tomcat下的bin/catalina.sh,设置JAVA_OPTS
JAVA_OPTS='-Xms128m -Xmx256m -XX:MaxPermSize=128m
-Djava.rmi.server.hostname=10.10.10.105
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=true
-Dcom.sun.management.jmxremote.password.file=/usr/java/default/jre/lib/management/jmxremote.password
-Dcom.sun.management.jmxremote.access.file=/usr/java/default/jre/lib/management/jmxremote.access'
/usr/java/default/jre/lib/management/jmxremote.password和/usr/java/default/jre/lib/management/jmxremote.access是两个文件(在JAVA_HOME\jre\lib\management下有模板),以下分别编辑两个文件
# /usr/java/default/jre/lib/management/jmxremote.password
#(123456、123456789为密码)
monitorRole 123456
controlRole 123456789
# /usr/java/default/jre/lib/management/jmxremote.access
monitorRole readonly
controlRole readwrite
新建完成这两个文件要修改jmxremote.password的权限
chmod 600 jmxremote.password
WEBLOGIC
1.找到/bin/ setDomainEnv.sh
2.在java_options 中添加
-Djava.rmi.server.hostname=10.10.122.236
-Dcom.sun.management.jmxremote.port=6001
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
或者上述tomcat 中的密码模式的配置参数;
visualvm配置
注意:
JMX实际是开了三个端口,分别是:
一个是JMX端口(需要指定),JMX远程连接端口。
一个是RMI端口(默认随机),实际通信用的端口。
一个是本地服务端口(随机),用于本地jstat、jconsole连接用,本地使用,我们不用理会。
程序连接,是先连上JMX端口,获取RMI端口,再连接RMI端口,问题就出在RMI端口上,一般没有配置指定端口号,程序默认会随机分配一个端口,容易让人忽略,在配置防火墙时只配了JMX端口,导致JMX连接不上。而且RMI端口是随机的,也不好配防火墙。
其实这个RMI端口是可以指定的,而且可以指定与JMX一致的端口,这样在配置防火墙时就方便多了,只需开放一个端口。 具体的配置是启动参数增加
-Dcom.sun.management.jmxremote.rmi.port=xxxx,