本文介绍的几种工具适用于监控与分析Jvm堆内内存、栈、垃圾回收的状况。对于堆外内存的情况,只适用于DirectByteBuffer类,不适用于Unsafe类。
- JConsole
- VisualVM
- Jprofiler
JConsole
远程连接配置
JConsole只能使用JMX方式。
假设内网服务器IP为:xxx.xx.xx.xx,服务器端启动java程序命令如下:
java
-Djava.rmi.server.hostname=xxx.xx.xx.xx # 远程服务器ip
-Dcom.sun.management.jmxremote # 允许JMX远程调用
-Dcom.sun.management.jmxremote.port=8091 # 自定义JMX端口号
-Dcom.sun.management.jmxremote.ssl=false # 是否需要ssl安全连接方式
-Dcom.sun.management.jmxremote.authenticate=false # 是否需要密钥
-jar xxxx.jar
在客户端打开jConsole,输入服务器ip与端口号,用户与密码不用填,再点击连接。
本文中所有的图片的ip跟私有程序名都会进行遮掩,以保护个人隐私。
如出现不安全连接的提示框,允许即可,连接成功如下:
如果-Dcom.sum.management.jmxremote.port配置为0,会随机指定一个端口号。但想查看这个端口号就不那么直观。
可以在代码中打印这个端口号:
String url = sun.management.ConnectorAddressLink.importRemoteFrom(0).get("sun.management.JMXConnectorServer.0.remoteAddress");
String portStr = url.substring(url.lastIndexOf(":") + 1, url.lastIndexOf("/jmxrmi"));
int port = Integer.valueOf(portStr);
System.out.println(port);
或者用netstate查看该java进程使用的网络端口号。一般会用到几个端口,其中一个就是。至于要怎么要精准找到这个端口,我也还没找到方法。
基础使用
内存监控:
可以查看堆中各个区的使用情况,以及看到gc的类型与时间。
线程监控
可以查看每个线程的运行状态跟堆栈跟踪信息,甚至提供了死锁检测的功能。
VisualVM
VisualVM与JConsole一样,也是jdk自带的调试工具。但相比jConsole,它的功能会强大一些,并可安装插件,增强该软件的能力。
远程连接配置
VisualVM有两种远程连接的方式,一种是可以使用上章节的JXM方式,另一种是使用jstatd。不过两种都不能支持所有功能,如前者不能使用插件VisualGC,后者不支持显示Cpu的监控与抽样器。幸运的是可以同时使用这两种连接方式。
VisualVM通过JXM方式连接:
创建远程服务器:
右键远程服务器,并选择“添加JMX连接…”
双击该新连接,即进入该远程服务器java进程的监控界面
Jstatd连接方式:
在服务器端创建jstatd.all.policy文件,并编辑如下:
grant codebase "file:${java.home}/../lib/tools.jar"{
permission java.security.AllPermission;
};
运行命令:
jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=xxx.xx.xx.xx &
如果不用-p参数指定端口号,则默认端口是1099。如果成功运行,则能在开发机的VisualVM左侧列表列出与jstatd执行用户相同的所有java。
注意采用上面statd的配置,同网络的用户都可以访问到这些进程。如有完全策略的要求,则要小心谨慎使用。
插件使用
插件下载地址:https://visualvm.github.io/pluginscenters.html
通过java的版本选择对应的插件版本
常用插件:
Visual GC:
JProfiler
上面两款是JDK自带免费的分析工具,而JProfiler是收费的商业软件,功能比上面两款更为强大。
远程连接配置
1、将Jprofiler Linux安装包jprofiler_linux_11_1_4.tar上传到服务器,并解压到某目录下
2、服务器上进行jprofiler安装目录下的bin文件夹,执行./jpenable,会列出当前用户所有运行的java进程
3、输入待监控的进程后面的数字,如5,回车
4、输入1,回车
5、输入一个指定的端口号,或保持系统推荐的端口,直接回车。
至此,服务器端某个进程的配置已完成。
6、客户端jprofiler在已安装后的前提下,创建一个远程连接“Session”-> “New Session”,除了要填写远程服务器的IP与端口号,其他可以保持默认。
如下图有数据收到,则表示连接成功。