最近一个项目部署在服务器上运行时出现了问题,经过排查发现是java内存溢出的问题,所以为了实时监控服务器java内存的情况,需要远程查看服务器上JVM内存的一些情况。另外服务器系统是CentOS 7 最小安装,没有图形化界面,不能采用vnc远程。所以只能通过VisualVM或者JConsole来远程JVM。

介绍两个jdk1.8自带的可视化监视工具

  • Jconsole:

Java 6.x采用JMX方式提供了一系列监视和管理虚拟机的API,随SDK一起发布的JConsole则是采用这些API实现监控虚拟机的使用工具。 JConsole能够提供被监控虚拟机的内存、线程、类的加载以及MBean等信息,从而能够对服务器的运行情况进行实时监控。 

 

  • JVisualVM:

是Netbeans的profile子项目,已在JDK6.0 update 7 中自带(java启动时不需要特定参数,监控工具在bin/jvisualvm.exe),能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的)。

 

VisualVM和JConsole在监控本地JVM的时候是很方便的。只要应用程序运行起来,我们就可以连接上本地JVM,从VisualVM里面监控JVM的情况。

远程服务器上的JVM监控就需要一些额外的配置。目前VisualVM支持两种监控方法:Jstatd方法和基于JMX的方法。

 

我们先介绍Jstatd方法

jstatd是一个rmi的server应用,用于监控jvm的创建和结束,并且提供接口让监控工具可以远程连接到本机的jvm 。jstatd位于 $JAVA_HOME/bin目录下,具体使用方法如下: 

 

1,启动RMI服务

在需要被监控的服务器上面,通过jstatd来启动RMI服务 

首先,配置java安全访问,在服务器jdk路径(/java_home/bin)下新建文件 

名称: jstatd.all.policy 

内容:

grant codebase "file:${java.home}/../lib/tools.jar" {
    permission java.security.AllPermission;
};

然后在进入jstatd.all.policy所在目录下,通过如下的命令启动RMI服务:

./jstatd -J-Djava.security.policy=jstatd.all.policy 

或者

这种方式亲测成功

./jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=服务器IP

 

#!/bin/bash
nohup ./jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=192.168.1.1 &

2.启动客户端的VisualVM,添加远程主机

VisualVM 在/java_home/bin目录下

连接后会自动加载出服务器JVM运行情况。

在Jstatd监控方式下,JConsole是不能启用的,因为JConsole登录需要端口号。

另外我们还可以为VisualVM安装一些插件,比如GC,MBeans等等。满足自己的需要。下一篇博客讲解以JVM方式实现远程监控。

 

原文链接

 

----------------------------------------------常见链接问题处理-----------------------------------------

(1)用hostname -i 命令查看返回的IP地址是不是127.0.0.1,如果是的话则说明是其它原因造成,无需再往下看了,否则进行入第2步。
(2)打开/etc下的hosts文件,将其中的“127.0.0.1   机器名”改成"你机器的IP  机器名"。
           例如:将127.0.0.1  ubuntuServer,改成192.168.1.99  ubuntuServer
(3)重新启动jstatd进程。
          如果在本地用jps 192.168.1.99可以看到远程java进程则说明成功了,此时你应该可以在VisualVM中通过jstatd方式连接远程主机了

Logo

更多推荐