JVM虚拟机监控及性能调优实战

大家好,欢迎来到 程序视点!我是小二哥。

今天我们再来聊聊jvisualvm

目录

jvisualvm介绍

代码语言:txt

复制

```
1. jvisualvm是JDK自带的可以远程监控内存,跟踪垃圾回收,执行时内存,CPU/线程分析,生成堆快照等的工具。
2. jvisualvm是从JDK1.6开始被继承到JDK中的。
```

jvisualvm使用

jvisualvm监控远程服务器

开启远程监控

  • 通过在服务器上设置jmx参数来开启vi /etc/profile export JAVA_OPTS='-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=N -Djava.rmi.server.hostname=x.x.x.x -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false'
  • 通过启动jar命令开启java -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=N -Djava.rmi.server.hostname=x.x.x.x -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar xxx.jar

连接

  • 打开jvisualvm,在远程中添加需要监控的服务器,然后再在该服务器下添加jmx监控连接

JVM虚拟机监控及性能调优实战

jvisualvm集成Visual-GC插件

Visual GC插件安装

  • 到https://visualvm.github.io/pluginscenters.html去下载对应的Visual GC Plugins

JVM虚拟机监控及性能调优实战

  • 更改visual-gc配置中心URL

JVM虚拟机监控及性能调优实战

  • 安装Visual GC Plugin

JVM虚拟机监控及性能调优实战

Visual GC正确开启步骤

  • 在远程主机上添加安全策略文件[root@localhost ~] touch jstatd.all.policy [root@localhost ~] vi jstatd.all.policy grant codebase "file:${java.home}/../lib/tools.jar" { permission java.security.AllPermission; };注意:如果没有配置JDK环境变量,file后需要添加tool.jar的绝对路径
  • 在远程主机上启动监控[root@localhost ~] jstatd -J-Djava.security.policy=/xxx/jstatd.all.policy -J-Djava.rmi.server.logCalls=true -J-Djava.rmi.server.hostname=xx.xx.xx.xx -p 1099参数说明-J-Djava.rmi.server.logCalls=true 打开日志,便于排错-J-Djava.rmi.server.hostname=xx.xx.xx.xx hostname是本机IP地址,确保client能访问到,另外查看本机的hosts是否有其他配置,这里有坑,具体参照常见问题中的XXXX
  • 可以查看端口是否被正常监听[root@localhost ~]# lsof -i:1099 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME jstatd 110703 root 15u IPv6 7374636 0t0 TCP *:rmiregistry (LISTEN) jstatd 110703 root 17u IPv6 7373817 0t0 TCP localhost:rmiregistry->x.x.x.x:62209 (ESTABLISHED)
  • 使用visualvm连接添加jstatd连接,注意端口号和远程服务器开启的端口号保持一致注意:远程服务器端口要设置开放
  • 参考视图

JVM虚拟机监控及性能调优实战

常见问题

  • 开启OOM-dumpnohup java -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=N -Djava.rmi.server.hostname=x.x.x.x -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -XX:+HeapDumpOnOutOfMemoryError -jar xxx.jar -XX:HeapDumpPath=~/dumps/ > nohup.log 2>&1 &
  • Visual GC提示"不受此JVM支持“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:884) 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)
  • Could not contact registry,指向的IP地址是一个其他的地址[root@localdomain bin]# ./jstatd -J-Djava.security.policy=jstatd.all.policy Could not contact registry Connection refused to host: y.y.y.y; nested exception is: java.net.ConnectException: Connection refused java.rmi.ConnectException: Connection refused to host: y.y.y.y; nested exception is:注意:我在这里查看了远程机器的hosts,发现其配有一些其他的IP,将其删除后能够联通
  • 快速定位导致cpu飙升的线程堆栈信息top 首先通过top命令找到高负载的CPU,获取进程id top -p <进程id> 精确定位到cpu高的进程,然后按H键,查看该进程所有线程 或者 top -p 进程id -H 查看进程下的线程 printf "%x" 进程id 将进程号转化为16进制,注意把十六进制的大写字母转换为小写 jstack 进程id > xxx.txt 导出日志,然后在日志中查找nid=转换后进程id 或者 jstack 进程ID|grep -A 10 55a0 10表示这个线程所在行后面10行,55a0是进程ID转换后的十六进制
  • 查看堆内存使用情况jps查看各个应用进程id jmap -heap java项目进程id jmap -histo 进程id > log.txt 查看此应用中各实例生成情况 jmap -histo:live [pid] > log.txt 过滤存活的对象
  • 查找代码死锁jstack 进程id > xxx.txt 导出日志 搜索 deadlock 或者查 locked关键字找到发生死锁线程

引用

  • jvisualvm简要说明
  • jvisualvm 连接 jstatd 远程监控 jvm 或 Visual GC提示"不受此JVM支持“
  • 使用Java VisualVM监控远程JVM
  • Visualvm 远程测试 问题
  • visualgc - Visual Garbage Collection Monitoring Tool

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/6694.html

(0)
LomuLomu
上一篇 2025 年 1 月 16 日 上午11:07
下一篇 2025 年 1 月 17 日

相关推荐

  • 【2024最新版可用】Intellij IDEA破解教程,附IDEA激活码

    IntelliJ IDEA 是一种广受欢迎的 Java 集成开发环境,被认为是最佳的 Java 开发工具之一。本文将分享如何通过脚本免费激活 IDEA 及 Jetbrains 全家桶工具,支持 2021 及以上版本,包括最新版本。 一、下载并安装 IDEA 首先,前往 JetBrains 官网下载最新版本的 IDEA。安装过程非常简单,按照提示一步步操作即可…

    未分类 2024 年 7 月 15 日
    2.3K00
  • 【数据结构】Java的HashMap 和 HashSet 大全笔记,写算法用到的时候翻一下,百度都省了!(实践篇)

    本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 !!! HashSet HashMap 前言 在探索Java集合框架的丰富世界时,我们不可避免地会遇到两个至关重…

    2025 年 1 月 19 日
    46800
  • 2025年MacBook苹果电脑多版本JDK安装与环境配置指南:从JDK8到JDK22的完整教程

    本指南最后更新于:2024年11月28日,包含最新版本支持。重要更新记录:- 2024年02月:新增JDK17环境配置- 2024年05月:解决Maven与JDK版本切换冲突问题- 2024年06月:针对M系列芯片用户推荐ARM版本- 2024年08月:新增JDK22支持- 2024年11月:优化内容排版与视觉效果 本教程所有操作步骤均经过实际验证,确保可行…

    2025 年 5 月 19 日
    1.3K00
  • Java刷题训练第一期

    个人主页:手握风云 专栏:Java刷题训练营 1. 字符转ASCII码 问题描述:BoBo教KiKi字符常量或字符变量表示的字符在内存中以ASCII码形式存储。BoBo出了一个问题给KiKi,输入一个字符,输出该字符相应的ASCII码。 输入描述:一行,一个字符。 输出描述:一行,输出输入字符对应的ASCII码。 算法分析:在Java当中,没有针对字符的输入…

    2025 年 1 月 11 日
    27800
  • 如何做好软件架构师

    本文以个人视野聊下软件架构师的工作以及软件架构设计知识。做开发工作接近10年了,期间主要做Windows应用开发。在成熟的“华南区最大WPF团队”希沃白板呆了较长一段时间、后面从0到1构建Windows技术栈以及会议屏软件集,在软件设计这块自己成长了很多。之前整理过如何做好技术经理 – 唐宋元明清2188 – 博客园,这里梳理下自己的设计思维,算是自己阶段性…

    未分类 2025 年 1 月 15 日
    40200

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信