使用jvisualvm监控Java程序(本地和远程)

0 原由

不感兴趣的能够直接从 1 本地Java程序监控 开始看java

0.1 发现问题

使用top命令查看Java程序使用的内存,大于设置的最大的使用内存。(top界面查看的是RES字段的值,设置Java程序运行最大堆内存方式是-Xmx方法)bash

这是我top的结果,大概是650MB。服务器

top查看进程运行状态

这是我执行Java程序的脚本,能够看到-Xmx500m,已经指定了500MB的最大使用堆内存。性能

运行Java程序的运行脚本

0.2 问题解决

  1. 查询top命令结果中RES字段的具体含义是进程使用的内存,未被换出的也算
  2. 查询-Xmx的含义,就是Java程序使用的最大堆内存。
  3. 经过以上能够说明,这两个含义并不对应。Java中除了堆内存,还有栈内存。因此比咱们设置的500MB多也正常。

由此考虑,如何才能监控Java程序使用内存情况呢?通过一番查找知道了Java自带的jvisualvm,可是找到的教程,按照操做又踩了不少坑。这里本身总结一下完整过程。加密

1 本地Java程序监控

1.1 本地启动jvisualvm

JDK根目录的bin文件夹下能够找到jvisualvm,直接在终端敲命令jvisualvm就能够运行,而后能够看到运行界面。spa

jVisualVM界面

而后我随便运行一个不会立刻关闭的Java程序,例如:插件

public class Main {

    public static void main(String[] args) throws InterruptedException {
        for (int i = 10000; i > 0; i--) {
            System.out.println("Hello World!");
            Thread.sleep(1000);
        }
    }
}
复制代码

而后,咱们看jvisualvm界面,在右侧能够看到咱们运行的程序,双击就能够在右侧看到咱们的程序:code

Main程序在VisualVM中的展现

具体监控的内容暂时不作介绍,咱们继续讲启动方式。cdn

1.2 IntelliJ IDEA的VusalVM

我使用的是IntelliJ Idea进行后台开发的。在IntelliJ Idea中有一个插件VusualVM Luncherserver

安装完成以后重启IDEA,而后在之前运行的地方能够看到:

若是你以前实验的jvisualvm窗口还开着,那你能够先把它关闭。而后使用Run With VisualVM运行程序,第一次会出现配置界面:

选择JDK根目录下,bin文件夹下的jvisualvm就能够了,完成配置,运行程序就能够看到启动了VisualVM,在Windows下能够直接打开运行的应用,但在Mac上不行,要本身双击才行。

2 远程Java程序监控

服务器开发有不少,打的包也不一样。咱们是直接打成Jar包,而后使用jar命令直接运行jar包。本文只提供jar包方式运行的方法。其余的例如war,使用Tomcat啊什么的能够根据本身开发的具体环境,去网上查找。可是注意2.3步提到的,我在这一步踩了好久的坑。

2.1 远程服务器配置JXM

在远程服务器上的JDK根目录下的/jre/lib/management文件夹下,将jmxremote.password.template文件复制一份jmxremote.password,而后打开jmxremote.password文件。

将里面的这两行注释去掉,monitorRolecontrolRole就是用户名,QEDR&D分别是密码,最后更改了密码,固然和可使用一样的格式本身添加用户,对于用户的权限是在jmxremote.access文件中配置的,这两个角色的权限默认已经配置了,若是本身添加的用户,你须要本身在这个文件中添加相应的配置,咱们暂时就使用controlRole这个角色,由于他的权限比较多:

#monitorRole QED
#controlRole R&D
复制代码

2.2 修改启动jar的参数

在运行jar的时候添加以下的参数,没有换行:

-Djava.rmi.server.hostname=10.40.2.90 -Dcom.sun.management.jmxremote.port=18999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=true
复制代码

hostname就是主机的地址,port就是端口号,请确认这个端口号不要被占用。ssl就是要不要加密,我这里连接的开发环境就不加密了,authenticate就是要不要用户认证,帐号密码就是上一步中配置的。

而后从新运行程序。

2.3 设置防火墙

敲黑板,注意这里

运行完程序以后关闭服务器的防火墙,有不少教程都是让把上一步中设置的端口号打开,可是其实,JXM还须要监听两个随机的接口。要不直接关了防火墙,要不就把使用到的端口都打开。

2.4 配置jvisualvm

在左侧远程右击添加远程主机

填写信息以后,能够看到左侧远程下多了一个远程主机,而后右击,选择添加JXM连接

而后连接OK。

3 VisualVM的使用方法

而后我经过VisualVM监控远程那个程序,看到堆内存只用了300多MB。

VisualVM的使用方法在网上有至关多的文章,这里推荐一篇我以为还不错的,我就再也不写了:

使用 VisualVM 进行性能分析及调优

相关文章
相关标签/搜索