VisualVM连接远程Java进程

jstatd是一个RMI(Remove Method Invocation)的server应用,用于监控jvm的创建和结束,并且提供接口让监控工具(如VisualVM)可以远程连接到本机的jvms 。注意是jvms,就是说运行jstatd命令后可以用监控工具监控本用户(运行jstatd命令的用户)所有已经启动的java程序。

jstatd的安装、启动、连接

JDK中默认就带 jstatd,如下图,Mac 下 JDK 默认安装在 /Library/Java/JavaVirtualMachines/版本号 目录下。

 

启动方式如下:

1、在服务器上新建文件,命名为jstatd.all.policy内容为:

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

2、在远程主机上启动 jstatd 并且不要关闭。

在服务器上jstatd.all.policy所在目录下执行下面的命令
其中 /usr/local/java/bin/jstatd为jstatd所在路径,为${JAVA_HOME}/bin/jstatd

/usr/local/java/bin/jstatd -J-Djava.security.policy=jstatd.all.policy 

想指定端口可以用下面命令:

jstatd -J-Djava.security.policy=jstatd.policy -p 1099

 

3、VisualVM 中连接

在客户端用visualvm连接部署jstatd的服务器ip,显示如下:

 

参考: http://comeonbabye.iteye.com/blog/1463133

添加完主机后,我们还需要添加 JMX 连接 和 jstatd 连接。

 

 

 

jstatd 的安全问题

jstatd服务只能监视具有适当的本地访问权限的JVM,因此jstatd进程与被监控的JVM必须运行在相同的用户权限中。但是有一些特殊的用户权限,如基于UNIX(TM)为系统的root用户,它有权限访问系统中所有JVM的资源,如果jstatd进程运行在这种权限中,那么它可以监视系统中的所有JVM,但是这也带来了额外的安全问题。

jstatd服务不会对客户端进行任何的验证,因此运行了jstatd服务的JVMs,网络上的任何用户的都具有访问权限,这种暴露不是我们所希望的,因此在启动jstatd之前本地安全策略必须要加以考虑,特别是在生产环境中或者是在不安全的网络环境中。

如果没有其他安全管理器被安装,jstatd服务将会安装一个RMISecurityPolicy的实例,因此需要在一个安全策略文件中指定,该策略文件必须符合的默认策略实施的策略文件语法。

下面的这个示例策略将允许jstatd服务具有JVM全部的访问权限:

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

注:此处策略中的java.home,和JAVA_HOME不是一个概念,不要搞错了,此处的java.home指的是JRE的路径,这个是Java的系统属性,不需要手工指定,通常是这个jdk下面的jre路径,即可以认为${java.home}和${JAVA_HOME}/jre是等价,如果想查看这个变量的值,可以任意找一个运行着的Java应用,找到它的PID,然后通过如下jinfo命令查看就可以查看到java.home的值:

jinfo ${PID}|grep java.home

参考:

http://blog.csdn.net/fenglibing/article/details/17323515 

http://bijian1013.iteye.com/blog/2221434

 

JMX连接

jstatd的远程监控,CPU的监控我这里看不到,这时候就要用到 JMX的连接了。

 

JMX 配置

远程机器的程序需要加上JVM参数

-Dcom.sun.management.jmxremote=true

-Dcom.sun.management.jmxremote.port=9090

-Dcom.sun.management.jmxremote.ssl=false

-Dcom.sun.management.jmxremote.authenticate=false

备注:另外需要检查 hostname –i,看解析出来是否为本地的IP,如是127.0.0.1或者IP为多个IP中之一,则其他的IP无效,会连接不上。

也可以使用如下的参数手动指定 hostname 或者 ip 地址

-Djava.rmi.server.hostname=192.168.0.1

然后就可以使用菜单中的 “Add JMX Connection”,连接远程地址。

以 tomcat 为例, 我们需要修改 catalina.sh 文件。
在下面这行上面添加文字。
  1. # ----- Execute The Requested Command ----------------------------------------- 
需要添加的文字:

JAVA_OPTS="-Djava.rmi.server.hostname=10.12.49.64

-Dcom.sun.management.jmxremote

-Dcom.sun.management.jmxremote.port=8081

-Dcom.sun.management.jmxremote.ssl=false

-Dcom.sun.management.jmxremote.authenticate=false $JAVA_OPTS"

export JAVA_OPTS

注:第一行的ip为tomcat所在服务器的ip;第三行的端口为jmx使用的端口,确保此端口是未被占用的;(不要少了第一行,我一开始配置的时候就是没有第一行,jmx一直连接不上)

启动tomcat,netstat -aux 看看8080,8081端口是否被监听,如果被监听,说明配置成功了,然后在visualvm的远程选择ip,右键,添加“jmx连接”,成功连接就成功了
参考: http://abc08010051.iteye.com/blog/2162970

参考:
http://www.360doc.com/content/11/1010/09/7656248_154804096.shtml

				
时间: 2024-10-05 10:24:33

VisualVM连接远程Java进程的相关文章

JVM探秘:VisualVM监控远程Java进程

VisualVM在Java 8中是JDK自带的一个图形化工具,项目主页 VisualVM,在后续版本中可能会从JDK移除. VisualVM可以监控Java进程的CPU与内存占用情况,可以监控Java进程内的各个线程的执行情况,还可以与MAT工具一样用来分析堆转储快照. 监控远程Tomcat进程 监控远程主机上的Tomcat进程,需要在Tomcat的catalina.sh文件中加入参数: JAVA_OPTS="$JAVA_OPTS -Dcom.sum.management.jmxremote -

利用JMX统计远程JAVA进程的CPU和Memory

从JAVA 5开始,JDK提供了一些JVM检测的API,这就是有名的java.lang.management 包,包里提供了许多MXBean的接口类,可以很方便的获取到JVM的内存.GC.线程.锁.class.甚至操作系统层面的各种信息,本文就简单的介绍 一种利用JMX对JAVA进程进行CPU.堆内存使用的监控.可能有人会觉得没必要这样做,因为用jconsole之类的工具都能做到,而且会比本文的例 子更详细.但是有些时候将console不一定能监控到作为系统服务的java进程,我最近就不得不自己

jvisualvm_使用jmx连接远程linux应用

[前提] JVisualVM是由Sun提供的性能分析工具,在Jdk6.0以后的版本中是自带的,如果是用Jdk1.5或以前版本的就得要单独安装了. [1]远程机器需要开启jmx 在使用jvisualvm之前要在服务器上开启jmx,因此需要在压测应用的TOMCAT_HOME/bin/catalina.sh文件中配置jmxremote: //catalina.sh文件中添加jmxremote配置:-Dcom.sun.management.jmxremote=true -Dcom.sun.managem

使用VisualVM监控远程服务器JVM

VisualVM是JDK自带的一款全能型性能监控和故障分析工具,包括对CPU使用.JVM堆内存消耗.线程.类加载的实时监控,内存dump文件分析,垃圾回收运行情况的可视化分析等,对故障排查和性能调优很有帮助.在windows中安装JDK后,VisualVM位于%JAVA_HOME%/bin/下,直接执行jvisualvm.exe即可,一个主要运行界面如图: VisualVM会自动检测本机运行中的JVM并建立连接,本文主要介绍连接远程Linux服务器的配置方法,测试环境为CentOS 6.5,JD

自定义命令杀死 java 进程 alias kjava

alias kjava='ps -ef|grep ProcessName |awk "{print $2}"|xargs kill -9' 上面脚本放在杀JAVA进程中,会出现一些错误警告提示,如果把 aux 改成 ef ,连同SecureCRT也会断开连接 杀死java 进程 ps -ef|grep java |grep -v grep|cut -c 9-15|xargs kill -9 编辑别名 alias kjava='ps -ef|grep java |grep -v grep

使用visualvm远程监控java进程(以hadoop进程为例)

(一)下载安装 1.下载visualvm 在官网上下载即可,有mac版 2.工具-插件,选择感兴趣的插件进行安装 此时若本地有运行java进程,则在本地那里已经可以进行监控分析 (二)远程服务器配置 1.在任意目录建立文件jstatd.all.policy,内容如下: grant codebase "file:${java.home}/../lib/tools.jar" { permission java.security.AllPermission; }; 2.运行jstad服务 n

利用VisualVm和JMX远程监控Java进程

自Java 6开始,Java程序启动时都会在JVM内部启动一个JMX agent,JMX agent会启动一个MBean server组件,把MBeans(Java平台标准的MBean + 你自己创建的MBean)注册到它里面,然后暴露给JMX client管理.简单来说就是每个Java程序都可以通过JMX来被JMX client管理,而且这一切都是自动发生的.而VisualVm就是一个JMX Client. VisualVm能够自动发现本机的Java进程,如果要监控远程主机上的Java进程则需

使用Java VisualVM监控远程JVM cpu jps

我们经常需要对我们的开发的软件做各种测试, 软件对系统资源的使用情况更是不可少, 目前有多个监控工具, 相比JProfiler对系统资源尤其是内存的消耗是非常庞大,JDK1.6开始自带的VisualVM就是不错的监控工具.这个工具就在JAVA_HOME\bin\目录下的jvisualvm.exe, 双击这个文件就能看到一个比较直观的界面 从左边Applications树中可以知道,不光可以监控本地JVM运行情况, 还可以监控远程机器上的JVM运行情况.本地监控:只要打开某个JAVA程序就会自动的

使用Java visualVM监控远程JVM

1 监控远程tomcat 对于被监控的tomcat,需要修改tomcat的bin目录下的Catalina.sh配置文件,增加如下配置. JAVA_ OPTS="$JAVA_ OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9004 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=f