• jstatd jvisualvm 远程监控jvm



    (1)【服务器端配置】

    在catalina.sh里添加

    JAVA_OPTS="$JAVA_OPTS
    -Djava.rmi.server.hostname=192.168.1.190
    -Dcom.sun.management.jmxremote.port=8950
    -Dcom.sun.management.jmxremote.authenticate=false
    -Dcom.sun.management.jmxremote.ssl=false"

    (2)jstatd [options]
    此命令是一个RMI Server应用程序,提供了对JVM的创建和结束监视,也为远程监视工具提供了一个可以attach的接口

    options
    -nr 当一个存在的RMI Registry没有找到时,不尝试创建一个内部的RMI Registry
    -p port 端口号,默认为1099
    -n rminame 默认为JStatRemoteHost;如果多个jstatd服务开始在同一台主机上,rminame唯一确定一个jstatd服务
    -J jvm选项

    jstatd
    会报如下错误:
    Could not create remote object
    access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write)
    java.security.AccessControlException: access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write)
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
    at java.security.AccessController.checkPermission(AccessController.java:546)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
    at java.lang.System.setProperty(System.java:727)
    at sun.tools.jstatd.Jstatd.main(Jstatd.java:122)

    这是因为没有给jstatd指定安全策略

    创建安全策略文件,并命名为jstatd.all.policy
    grant codebase "file:${java.home}/../lib/tools.jar" {
    permission java.security.AllPermission;
    };

    注:${java.home} 被识别为当前jstatd的目录,即使系统指定JAVA_HOME,$JAVA_HOME也不能被识别。。。或者直接使用绝对路径。jstatd.all.policy可以放在任何位置,运行时需要指定绝对路径。

    再次启动(默认端口1099)
    jstatd -J-Djava.security.policy=jstatd.all.policy

    (jstatd -J-Djava.security.policy=jstatd.all.policy & 可以后台运行)

    就可以通过jvisualvm连接了。注 同时需要执行一个命令查看本机对外ip(linux需要)Hostname –i

    如果显示是127.0.0.1或者其他ip,与对外ip不同,则需要修改/etc/hosts文件,去掉对本机名的配置,让本机名解析到它的IP地址,如10.20.131.214。(或者在启动的时候使用jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=10.20.131.214 & 不需要修改hosts文件,因为修改此文件还可能影响到其他程序。 )

    然后在jvisualvm中通过Add Remote Host添加10.20.131.214来访问

    更多示例 :
    (1)使用内部RMI Registry
    jstatd -J-Djava.security.policy=jstatd.all.policy (默认端口为1099)
    (2)使用外部RMI Registry
    a)使用默认值
    rmiregistry&
    jstatd -J-Djava.security.policy=jstatd.all.policy
    b)使用2020端口
    rmiregistry 2020&
    jstatd -J-Djava.security.policy=all.policy -p 2020
    c)使用2020端口,使用rminame
    rmiregistry 2020&
    jstatd -J-Djava.security.policy=jstatd.all.policy -p 2020 -n AlternateJstatdServerName
    (3)RMI Registry已经启动,不创建内部RMI Registry
    jstatd -J-Djava.security.policy=jstatd.all.policy -nr
    (4)RMI日志能力
    jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.logCalls=true

     
  • 相关阅读:
    Git连接Github
    全民来打飞机~~(设计探讨)
    mongo学习
    redis aop持久化
    redis的超时删除策略
    redis 学习,没事的时候看看增长知识面
    MySQL query / clause execution order
    用redis做超时判断 感觉写的很有意思
    python 编码问题(转载)
    git 个人学习
  • 原文地址:https://www.cnblogs.com/liuys635/p/12531047.html
Copyright © 2020-2023  润新知