当前位置: 首页 > article >正文

使用jvisualvm远程连接Linux服务器上java进程

使用jvisualvm连接远程服务器有两种方式:JMXjstatd,两种方式都不能完美支持所有功能,例如JMX不支持VisualGC,jstatd不支持CPU监控,实际使用可同时配置上并按需选用。

一、jstatd连接

 1、在Linux中配置远程授权

要监控Linux服务器,需要在该服务器上运行jstatd守护进程

1.1、配置jstatd守护进程并开启策略授权

jdk/bin/目录下找到jstatd(也就是jdk安装目录下的bin目录下,例如/usr/local/soft/java/jdk1.8/bin),在执行这个命令之前,需要进行安全策略授权。在jdk/bin目录下,创建名称为jstatd.all.policy的文件,内容如下:

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

修改 jdk安装目录下/jre/lib/security/java.policy文件(例如:/usr/local/soft/java/jdk1.8/jre/lib/security/java.policy),并在最后增加如下内容:

//添加下面内容
permission java.security.AllPermission;

添加完,整体文件如下:

// Standard extensions get all permissions by default
​
grant codeBase "file:${{java.ext.dirs}}/*" {
        permission java.security.AllPermission;
};
​
// default permissions granted to all domains
​
grant {
        // Allows any thread to stop itself using the java.lang.Thread.stop()
        // method that takes no argument.
        // Note that this permission is granted by default only to remain
        // backwards compatible.
        // It is strongly recommended that you either remove this permission
        // from this policy file or further restrict it to code sources
        // that you specify, because Thread.stop() is potentially unsafe.
        // See the API specification of java.lang.Thread.stop() for more
        // information.
        permission java.lang.RuntimePermission "stopThread";
​
        // allows anyone to listen on dynamic ports
        permission java.net.SocketPermission "localhost:0", "listen";
​
        // "standard" properies that can be read by anyone
​
        permission java.util.PropertyPermission "java.version", "read";
        permission java.util.PropertyPermission "java.vendor", "read";
        permission java.util.PropertyPermission "java.vendor.url", "read";
        permission java.util.PropertyPermission "java.class.version", "read";
        permission java.util.PropertyPermission "os.name", "read";
        permission java.util.PropertyPermission "os.version", "read";
        permission java.util.PropertyPermission "os.arch", "read";
        permission java.util.PropertyPermission "file.separator", "read";
        permission java.util.PropertyPermission "path.separator", "read";
        permission java.util.PropertyPermission "line.separator", "read";
​
        permission java.util.PropertyPermission "java.specification.version", "read";
        permission java.util.PropertyPermission "java.specification.vendor", "read";
        permission java.util.PropertyPermission "java.specification.name", "read";
​
        permission java.util.PropertyPermission "java.vm.specification.version", "read";
        permission java.util.PropertyPermission "java.vm.specification.vendor", "read";
        permission java.util.PropertyPermission "java.vm.specification.name", "read";
        permission java.util.PropertyPermission "java.vm.version", "read";
        permission java.util.PropertyPermission "java.vm.vendor", "read";
        permission java.util.PropertyPermission "java.vm.name", "read";
        //添加下面内容
        permission java.security.AllPermission;
};

1.2、配置完后,在jdk/bin目录下执行jstatd命令,命令为:

# jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=ip (hostname 为你的 IP)
# & 是后台运行
./jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=192.168.137.130 &

或者
./jstatd -J-Djava.security.policy=all.policy &
#启动后会开启注册端口1099和一个随机的连接端口,注册端口也可通过-p参数指定,如./jstatd -J-Djava.security.policy=all.policy -p 10003 &

如果ava.policy未配置,启动报错,错误信息如下:

/usr/local/jdk1.8.0_321/bin/jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=192.168.137.130
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:472)
    at java.security.AccessController.checkPermission(AccessController.java:886)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
    at java.lang.System.setProperty(System.java:792)
    at sun.tools.jstatd.Jstatd.main(Jstatd.java:139)

例如:未配置./jre/lib/security/java.policy文件错误如下图。

配置完 ./jre/lib/security/java.policy文件,再次运行jstatd命令,成功之后如下图

1.3、设置防火墙

关闭防火墙,或将1099(守护进程默认注册端口)添加到防火墙规则外,还需要找到另外一个随机端口也加入到规则中

netstat -anp | grep *jstatd

可以看到除了1099,jstatd还监听了53040端口,把这个也加入到规则中,添加方法参照2.5

(注意:这个随机端口重启后会变化)

 2、在windows系统中java安装目录中jdk/bin/目录下的jvisualvm.exe启动程序

启动VisualVM,因为在配置JMX时已经添加过服务器节点,如果配置正确,通常VisualVM会自动检测到jstatd连接并添加节点

 二、使用jconsole连接

JConsole 是 Java 自带的图形化性能监控工具

先进入 JDK 安装之后的 bin 目录,若是配置过 Java 的环境变量,直接运行 JConsole 就行,效果如下

若是要监控本地 Java 进程,直接选择列表中的名称进行连接即可。

若是要监控远程 Java 进程,需要在远程 Java 程序启动时,需要加上下面几句话。

# 远程服务器的ip地址
-Djava.rmi.server.hostname=127.0.0.1 
# 指定jmx监听的端口
-Dcom.sun.management.jmxremote.port=8099 
# 指定jmx监听的端口
-Dcom.sun.management.jmxremote.rmi.port=8099 
# 是否开启ssl
-Dcom.sun.management.jmxremote.ssl=false 
# 是否开启认证
-Dcom.sun.management.jmxremote.authenticate=false

例如:
#设置java运行参数
DEFAULT_JAVA_OPTS=" -server -Xmx${XMX_V}m -Xms${XMS_V}m -Xmn${XMN_V}m -XX:PermSize=128m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 "
DEFAULT_JAVA_OPTS="${DEFAULT_JAVA_OPTS}-Djava.rmi.server.hostname=192.168.137.130 -Dcom.sun.management.jmxremote.port=8099 -Dcom.sun.management.jmxremote.rmi.port=8099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"

 可以看到一个8099端口的进程存在

远程来呢即可。 

参考资料: 

​​​​​​1、​Java性能优化工具精选-CSDN博客

2、使用VisualVM远程监控JVM Linux服务器配置方法 - Darren& - 博客园

3、JVM调优工具-VisualVM 远程连接服务器_visualvm远程连接-CSDN博客


http://www.kler.cn/a/455127.html

相关文章:

  • 【SpringMVC】Bean 加载控制
  • 深度学习中的并行策略概述:1 单GPU优化
  • 2、C#基于.net framework的应用开发实战编程 - 设计(二、三) - 编程手把手系列文章...
  • node.js和js
  • yolov5及其算法改进
  • 邮箱手机号脱敏
  • 简单讲解关于微信小程序调整 miniprogram 后, tabbar 找不到图片的原因之一
  • 【FastAPI】中间件
  • Ingress-Nginx Annotations 指南:配置要点全方面解读(下)
  • openai chatgpt原理介绍
  • 智能家居实训室中,STC单片机驱动的“互联网+”智能家居系统设计
  • 【C++动态规划 图论】3243. 新增道路查询后的最短距离 I|1567
  • (ICCV-2023)SVDiff:用于扩散微调的紧凑参数空间
  • c++ 命名空间
  • Android:bug记录(简单)
  • 免费线上签字小程序,开启便捷电子签名
  • vue2中使用 v-html 指令渲染的标签, 标签内绑定的 click 事件
  • VMware替换应该关注哪些因素?越来越多的用户倾向于选择脱离硬件绑定的独立虚拟化软件
  • springboot 使用注解设置缓存时效
  • 自然语言处理(NLP)中的事件检测和事件抽取
  • React性能优化:构建更高效的应用
  • AIDD -人工智能药物设计-RDKit | 基于不同描述符和指纹的机器学习模型预测logP
  • pyqt和pycharm环境搭建
  • 【Python】‌数据库工具类,使用python连接sql server数据库
  • 12.13[java exp4][debug]nginx 500,究极未解之谜,出自重启,解决自重启,迷???
  • 【微信小程序】页面跳转基础 | 我的咖啡店-综合实训