zoukankan      html  css  js  c++  java
  • 使用jvisualVm监控本地和远程的jvm

    jvisualVm是jdk自带的可视化监控工具,功能很强大,可安装各种扩展插件。本篇不打算讲解如果使用详细的功能,只讲在windows环境怎么监控本地和远端(一般是无界面的linux系统)的java进程。

    1、在远程机器上添加权限策略文件

         在服务器{JAVA_HOME}/bin目录建立文件:jstatd.all.policy(名字随便,符合*.policy即可), 文件内容为:

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

    2、修改服务器 hosts 文件中的 IP 地址

       要使Java VisualVM 成功连接到远程服务器上,服务器端应该在 /etc/hosts 文件中把本机地址设为本机的 IP 地址。使用 hostname -i 命令查看,如果显示的是 127.0.0.1 或者与本机实际 IP 不一致的话,需要把 /etc/hosts 文件中相应的地址改为本机实际 IP 。

    3、运行 jstatd 守护程序

    在jstatd.all.policy 当前目录运行

    nohup $JAVA_HOME/bin/jstatd -J-Djava.security.policy=jstatd.all.policy &

    如果需要RMI 日志功能的话,还可以在启动参数中加入 -J-Djava.rmi.server.logCalls=true 。

    nohup $JAVA_HOME/bin/jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.logCalls=true &

    可以自己制定jstatd的端口,加-p <port> 参数,默认端口为1099.

    我擦,报错了·····   

     Could not bind /JStatRemoteHost to RMI Registry
        java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
            java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
            java.lang.ClassNotFoundException: sun.jvmstat.monitor.remote.RemoteHost (no security manager: RMI class loader disabled)
            at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:419)
            at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267)
            at sun.rmi.transport.Transport$1.run(Transport.java:177)
            at sun.rmi.transport.Transport$1.run(Transport.java:174)
            at java.security.AccessController.doPrivileged(Native Method)
            at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
            at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553)
            at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
            at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
            at java.lang.Thread.run(Thread.java:722)
            at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:273)
            at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:251)
            at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:377)
            at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
            at java.rmi.Naming.rebind(Naming.java:177)
            at sun.tools.jstatd.Jstatd.bind(Jstatd.java:57)
            at sun.tools.jstatd.Jstatd.main(Jstatd.java:143)

    不用担心,这种错误是你的端口被占用了,jstatd默认启动1099端口,使用netstat -anp | grep 1099 看看端口是不是被占用了!如果被占用换一个端口。

    jstatd -J-Djava.security.policy=jstatd.all.policy -p 2099

    4、使用本地jvisualVm连接远程主机

    进过1、2、3步骤,最后我们使用window本地的jvisualVm连接配置好的远程主机,这个很简单,不介绍。

    但是问题来了,第3部的时候连接配置却怎么也没有看到远程机器的java进程,排查这个问题,请确定你的一下步骤是否成功

    (1)服务端机器jstatd服务是否开启:使用jps查看是否有jstatd进程。

    (2)确定本地机器是否连接上远程服务器,使用netstat -anp | grep jstatd进程ID查看网络连接,是否有你本地机器IP

    配置并启动jvisualvm

    直接命令行启动jvisualvm或{JAVA_HOME}/bin目录,找到jvisualvm.exe程序,双击打开。

    如果重新指定了jstatd端口,选择高级设置修改端口,如下图: 

    通过以上方式连接服务器发现一个问题,不能监控CPU 。提示我们建立 JMX ,建立 JMX 提示要求端口号。(JMX: Java Management Extensions ,即 Java 管理扩展 , 是一个为应用程序、设备、系统等植入管理功能的框架。 JMX可以跨越一系列异构操作系统平台、系统体系结构和 网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。而 Visual VM是通过 JMX 来和远程 Java 应用联系的 )。

    5、jvm进程启动项配置

    以tomcat为例:

    服务器的 tomcat 配置 jvm 启动参数。 在 tomcat 的 catalina.sh 中添加如下参数:

    JAVA_OPTS="-Djava.rmi.server.hostname=192.168.0.216 -Dcom.sun.management.jmxremote.port=1100 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
    注:
    -Dcom.sun.management.jmxremote.port :1100 这个是配置远程 connection 的端口号的,要确定这个端口没有被占用
    -Dcom.sun.management.jmxremote.ssl=false   指定了 JMX 是否启用 ssl
    -Dcom.sun.management.jmxremote.authenticate=false   指定了JMX 是否启用鉴权(需要用户名,密码鉴权)
    前面是固定配置,是 JMX 的远程服务权限的
    -Djava.rmi.server.hostname :这个是配置 server 的 IP 的

    如果同时配置了JMX,可以在添加JMX连接如下图: 

    添加后如图所示: 
     

    本文转载自:http://ihuangweiwei.iteye.com/blog/1219302

  • 相关阅读:
    SSH框架——(二)四层结构:DAO,Service,Controller,View层
    Spring知识概括梳理
    设计模式——(一)工厂模式2
    设计模式——(一)工厂模式1
    Spring——(一)IoC
    Toad 实现 SQL 优化
    string 和String的区别
    StructureMap依赖注入
    Oracle/PLSQL: BitAnd Function
    log.debug(e.getMessage());
  • 原文地址:https://www.cnblogs.com/uncleyong/p/9734454.html
Copyright © 2011-2022 走看看