不感兴趣的能够直接从 1 本地Java程序监控 开始看java
使用
top
命令查看Java程序使用的内存,大于设置的最大的使用内存。(top
界面查看的是RES
字段的值,设置Java程序运行最大堆内存方式是-Xmx
方法)bash
这是我top的结果,大概是650MB。服务器
这是我执行Java程序的脚本,能够看到-Xmx500m,已经指定了500MB的最大使用堆内存。性能
top
命令结果中RES
字段的具体含义是进程使用的内存,未被换出的也算。-Xmx
的含义,就是Java程序使用的最大堆内存。由此考虑,如何才能监控Java程序使用内存情况呢?通过一番查找知道了Java自带的jvisualvm,可是找到的教程,按照操做又踩了不少坑。这里本身总结一下完整过程。加密
在JDK
根目录的bin
文件夹下能够找到jvisualvm
,直接在终端敲命令jvisualvm
就能够运行,而后能够看到运行界面。spa
而后我随便运行一个不会立刻关闭的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
具体监控的内容暂时不作介绍,咱们继续讲启动方式。cdn
我使用的是IntelliJ Idea
进行后台开发的。在IntelliJ Idea
中有一个插件VusualVM Luncher
server
安装完成以后重启IDEA,而后在之前运行的地方能够看到:
若是你以前实验的jvisualvm窗口还开着,那你能够先把它关闭。而后使用Run With VisualVM
运行程序,第一次会出现配置界面:
选择JDK根目录下,bin
文件夹下的jvisualvm
就能够了,完成配置,运行程序就能够看到启动了VisualVM
,在Windows下能够直接打开运行的应用,但在Mac上不行,要本身双击才行。
服务器开发有不少,打的包也不一样。咱们是直接打成Jar包,而后使用jar命令直接运行jar包。本文只提供jar包方式运行的方法。其余的例如war,使用Tomcat啊什么的能够根据本身开发的具体环境,去网上查找。可是注意2.3步提到的,我在这一步踩了好久的坑。
在远程服务器上的JDK根目录下的/jre/lib/management
文件夹下,将jmxremote.password.template
文件复制一份jmxremote.password
,而后打开jmxremote.password
文件。
将里面的这两行注释去掉,monitorRole
和controlRole
就是用户名,QED
和R&D
分别是密码,最后更改了密码,固然和可使用一样的格式本身添加用户,对于用户的权限是在jmxremote.access
文件中配置的,这两个角色的权限默认已经配置了,若是本身添加的用户,你须要本身在这个文件中添加相应的配置,咱们暂时就使用controlRole
这个角色,由于他的权限比较多:
#monitorRole QED
#controlRole R&D
复制代码
在运行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
就是要不要用户认证,帐号密码就是上一步中配置的。
而后从新运行程序。
敲黑板,注意这里
运行完程序以后关闭服务器的防火墙,有不少教程都是让把上一步中设置的端口号打开,可是其实,JXM还须要监听两个随机的接口。要不直接关了防火墙,要不就把使用到的端口都打开。
在左侧远程
右击添加远程主机
:
填写信息以后,能够看到左侧远程
下多了一个远程主机,而后右击,选择添加JXM连接
:
而后连接OK。
而后我经过VisualVM监控远程那个程序,看到堆内存只用了300多MB。
VisualVM的使用方法在网上有至关多的文章,这里推荐一篇我以为还不错的,我就再也不写了: