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

news/2024/5/18 23:02:33

目录

jvisualvm介绍

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监控连接
alt

jvisualvm集成Visual-GC插件

Visual GC插件安装

  • 到https://visualvm.github.io/pluginscenters.html去下载对应的Visual GC Plugins
alt
  • 更改visual-gc配置中心URL
alt
  • 安装Visual GC Plugin
alt

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连接,注意端口号和远程服务器开启的端口号保持一致

    注意:远程服务器端口要设置开放

  • 参考视图

alt

常见问题

  • 开启OOM-dump

    nohup 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

本文由 mdnice 多平台发布


http://www.mrgr.cn/p/64204347

相关文章

初入数据库

SQL&#xff1a;操作关系型数据库的编程语言&#xff0c;定义了一套操作关系型数据库的统一标准。 DDL&#xff08;Data Definition Language&#xff09;数据定义语言 数据库 show databases;create database db01;use db01;select database(); 显示当前使用的数据库drop d…

05、应急事件检测

应急事件检测 1.Windows 系统 1.1.Windows 系统用户账号收集 查找本地用户和组:lusrmgr.msc 查找用户:net user 查找本地管理员组用户:net localgroup administrators 使用 powershell 查找用户:Get-LocalUser 1.2.Windows 系统进程信息收集 任务管理器(Ctrl+Shift+Esc)(…

SEGGER Embedded Studio IDE移植FreeRTOS

SEGGER Embedded Studio IDE移植FreeRTOS 一、简介二、技术路线2.1 获取FreeRTOS源码2.2 将必要的文件复制到工程中2.2.1 移植C文件2.2.2 移植portable文件2.2.3 移植头文件 2.3 创建FreeRTOSConfig.h并进行配置2.3.1 处理中断优先级2.3.2 configASSERT( x )的处理2.3.3 关于系…

mybatis中<if>条件判断带数字的字符串失效问题

文章目录 一、项目背景二、真实错误原因说明三、解决方案3.1针对纯数字的字符串值场景3.2针对单个字符的字符串值场景 四、参考文献 一、项目背景 MySQL数据库使用Mybatis查询拼接select语句中进行<if>条件拼接的时候&#xff0c;发现带数字的或者带单个字母的字符串失效…

md5绕过

md5绕过 ($a != $b && md5($a) == md5($b))的绕过 传参a=s1885207154a,b=s1836677006aMD5值:md5("s1885207154a") => 0e509367213418206700842008763514md5("s1836677006a") => 0e481036490867661113260034900752在PHP中 0e开头表示为科学…

Hadoop——Yarn基础架构

Hadoop——Yarn基础架构 Hadoop YARN&#xff08;Yet Another Resource Negotiator&#xff09;是Apache Hadoop生态系统中的一个子项目&#xff0c;它是用于集群资源管理的框架&#xff0c;负责为运算程序提供服务器运算资源&#xff0c;相当于一个分布式的操作系统平台&…

js的算法-交换排序(冒泡)

交换排序 所谓交换排序&#xff0c;是指根据序列中两个元素关键字的比较结果来对换这两个记录在序列中的位置。基于交换的排序算法很多&#xff0c;本次介绍冒泡排序和快速排序。 冒泡 基本思想 从后往前&#xff08;或从前往后&#xff09;两两比较相邻元素的值&#xff0…

01_Linux最简单驱动-helloworld

Linux最简单驱动-helloworld 驱动分为四个部分: ​ 头文件 ​ 驱动模块的入口和出口 ​ 声明信息 ​ 功能实现 第一步,包含头文件 #include <linux/init.h> 包含宏定义的头文件 #include <linux/module.h> 包含初始化加载模块的头文件 第二步,驱动模块的入口和出…

《QT实用小工具·四十二》圆形发光图像

1、概述 源码放在文章末尾 该项目实现了图像的发光效果&#xff0c;特别适合做头像&#xff0c;项目demo演示如下所示&#xff1a; 项目部分代码如下所示&#xff1a; import QtQuick 2.7 import QtGraphicalEffects 1.12Item {id: rootwidth: 80height: 80property int ra…

Grid 布局

文章目录 容器属性display 属性grid-template-columns 和 grid-template-rows 属性row-gap、column-gap、gap 属性grid-template-areas 属性grid-auto-flow 属性justify-items、align-items、place-items 属性justify-content、align-content、place-content 属性grid-auto-col…

KNN算法思想与Python实现

古语说得好,物以类聚,人以群分;近朱者赤,近墨者黑。这两句话的大概意思就是,你周围大部分朋友是什么人,那么你大概率也就是这种人,这句话其实也就是K最近邻算法的核心思想。kNN(k- Nearest Neighbor)法即k最邻近法,最初由 Cover和Hart于1968年提出,是一个理论上比较…

数据结构练习-算法与时间复杂度

----------------------------------------------------------------------------------------------------------------------------- 1. 设n是描述问题规模的非负整数&#xff0c;下列程序段的时间复杂度是( )。 x0;while(n>(x1)*(x1)xx1; A.O(logn) B.O(n^(1/2)) C.O(n)…

递归神经网络(RNN)在AI去衣技术中的深度应用

在人工智能&#xff08;AI&#xff09;技术飞速发展的今天&#xff0c;图像处理和计算机视觉领域不断取得新的突破。其中&#xff0c;AI去衣技术作为一个具有挑战性的研究方向&#xff0c;引起了广大研究者和公众的关注。递归神经网络&#xff08;RNN&#xff09;作为深度学习的…

HarmonyOS 应用生命周期有哪些? 按返回键会调用哪些生命周期?

UIAbility 生命周期:onCreate :页面初始化,变量定义,资源加载。 onWindowStageCreate:设置 UI 界面加载、设置 WindowStage 的事件订阅。 onForeground:切换至前台,申请系统需要的资源,或者重新申请在 onBackground()中释放的资源。 onBackground:切换至后台,释放 U…

(007)Blender 根据顶点组分离模型

1.选中模型&#xff0c;并且进入【3D视图】【编辑模式】&#xff1a; 2.选择顶点组&#xff1a; 3.分离选中项&#xff1a;

DRF之过滤 排序 分页

DRF之过滤 排序 分页使用【过滤 排序 分页】都需要在继承了GenericAPIView的视图类下使用 并指定类属性【queryset 和 serializer_class】【一】过滤 # 所有过滤类都继承 【BaseFilterBackend】 from rest_framework.filters import BaseFilterBackend【1】drf自带的过滤 # 导入…

图文结合手把手教你创建SpringCloud项目

前言 什么是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的开发便利性简化了分布式系统的开发,比如服务注册、服务发现、网关、路由、链路追踪等。Spring Cloud 并不是重复造轮子,而是将市面上开发得比较好的模块集成进去,进行封装,从而减少了…

redis中的缓存穿透问题

缓存穿透 缓存穿透问题&#xff1a; 一般请求来到后端&#xff0c;都是先从缓存中查找数据&#xff0c;如果缓存中找不到&#xff0c;才会去数据库中查询数据。 而缓存穿透就是基于这一点&#xff0c;不断发送请求查询不存在的数据&#xff0c;从而使数据库压力过大&#xff…

ubuntu无法用快捷键启动终端(CTRL+AIT+T)

我的电脑不知道安装什么东西之后&#xff0c;就不能用快捷键&#xff08;CTRLAITT&#xff09;打开终端了 只能在文件夹内&#xff0c;点击鼠标右键选择终端&#xff0c;然后打开终端 一直这么用了几个月&#xff0c;今天实在受不了了&#xff0c;所以解决此问题 本文参考文章…

力扣-118. 杨辉三角

1.题目介绍 题目地址(118. 杨辉三角 - 力扣(LeetCode)) https://leetcode.cn/problems/pascals-triangle/ 题目描述 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows = 5 输出: …