jvisualvm工具使用

jvisualvm 是JDK自带的具有图形界面操作功能的JVM性能监控和诊断工具,它不仅能分析和诊断堆转储文件,在线实时监控本地JVM进程,还能监控远程服务器上的JVM进程。

1 分析服务器下载dump文件

1)在我们在安装JDK的bin目录双击jvisaulvm.exe程序,程序启动成功后会进入Java VisualVM界面

图片

2)依次点击 文件-> 装入-> 选择文件名和文件类型,文件类型选择【堆Dump】导入我们从服务器上下载的dump文件

图片

3)然后点击【打开】后 Java VisualVM UI 的右边主界面会新增一个Tab页显示导入的dump文件的概要信息

图片

4)点击下面的【显示线程】链接可以看到线程信息

图片

5)点击【概要】右边的【类】可以看到主要占内存的类名、实例数以及占内存大小

图片

可以看到这个堆中占内存前三位的分别是byte[]StringConcurrentHashMap$Node三个类

注意:生产环境一般不能使用jmap -dump 命令生成堆转储文件,因为执行这个命令的时候会导致STW(应用主线程停顿),影响应用的正常使用。而一般通过设置两个jvm启动参数:-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=<filename> 在堆内存溢出时实现自动生成堆转储文件。然后我们从服务器上下载堆转储文件后通过Java VisualVM或者Eclipse Memory Analyzer内存分析工具导入我们下载的dump文件进行分析诊断。

2 分析内存溢出dump文件

首先需要我们设置JVM启动参数测试堆内存溢出时自动导出堆转储文件

1)在我们的本地启动的Java服务中通过IDEA设置启动类参数

图片

四个JVM启动参数分别如下:

-Xms50m
-Xmx50m
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=D:\heapdump\blogDump.hprof

然后点击下面的【ok】使之生效

2)在JVMTestController类中新增一个能导致内存溢出的接口

@GetMapping("/testOutMemoryError")public RespBean<List<UserDTO>> outMemoryErrorTest(){List<UserDTO> userDTOList = new ArrayList<>();for(int i=0;i<1000000;i++){UserDTO userDTO = new UserDTO();userDTO.setId(i+1);userDTO.setUsername("username"+i);userDTO.setNickname("张三"+i);userDTO.setPhoneNum(18975623568L);userDTO.setEmail("ZhangSan"+i+"@163.com");userDTO.setEnabled(1);userDTO.setRegTime(new Timestamp(System.currentTimeMillis()));userDTO.setUpdateTime(new Timestamp(System.currentTimeMillis()));userDTOList.add(userDTO);}RespBean<List<UserDTO>> respBean = new RespBean<>();respBean.setStatus(200);respBean.setMsg("success");respBean.setData(userDTOList);return respBean;}

3)重启服务后在ApiPost中新建一个http接口,并在请求头中带上用户登录成功后返回的authToken认证信息

图片

点击【发送按钮】一段时间后会返回内存溢出异常信息,同时在D:\heapdump目录下生成了堆转储文件blogDump.hprof

4)我们同样在 Java VisualVM中导入这个dump文件可以看到它的概要信息和类实例信息

图片

内存溢出堆转储概要信息

图片

​ 内存溢出堆转储类实例信息

从内存溢出堆转储实例信息中我们可以看到UserDTO类产生了47899个实例对象占用了4406708字节的堆内存。

3 本地JVM监控

本地监控很简单,打开VisualVM 就可以从左侧栏目里看到本机的应用,点击对应的应用就可以看到对应的内存、线程、GC信息

图片

如果应用出现线程死锁也能通过【线程】tab页看到

图片

点击右上方的【线程 Dump】可以看到线程死锁的具体原因

图片

5 远程JVM监控

VisualVM不仅能监控本地的应用程序,还可以监控远程服务器上的应用,虽然远程监控一般不会用于生产环境的,但是在测试环境做一些压力测试做一些性能的预调优,这个时候使用VisualVM来远程监控测试服务器的JVM使用情况,这样有助于我们了解到JVM的实时运行状态而进行优化和调整。

1)应用配置jmx支持

需要使用VisualVM监控某个远程服务器的JVM应用,那么首先要对需要配置远程监控应用对MX的支持

配置方式:

  • jar包启动:直接 java -jar <jmx相关参数>;
  • tomcat启动:编辑tomcat的catalina.sh配置文件增加JAVA_OPTS配置

jar 包启动配置案例

 nohup java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.local.only=true -Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.rmi.port=8999 -Dcom.sun.management.jmxremote.access.file=jmx.access -Dcom.sun.management.jmxremote.password.file=jmx.password -Djava.rmi.server.hostname=159.138.489 -jar jstx-server.jar&

需要注意的参数:

  • Dcom.sun.management.jmxremote.port:指定jms通讯端口,这个随意只要不与其他应用冲突即可
  • Djava.rmi.server.hostname:连接IP,填写当前服务器的外网IP
  • Dcom.sun.management.jmxremote.ssl:是否位加密连接
  • Dcom.sun.management.jmxremote.authenticate:是否进行权限连接认证,flase 不需要,ture的话就需要指定用户名,密码配置。
  • management.jmxremote.access.file: 用户名 和对应用户的权限配置
  • Dcom.sun.management.jmxremote.password.file:用户名对应的密码
  • 创建用户名密码
  • 如果Dcom.sun.management.jmxremote.authenticate 配置为true则需要进行此步骤

编辑jmx.access文件添加用户名 并指定权限

执行命令:vim jmx.access

添加内容:admin readwrite

jmx.password文件里指定用户名和对应密码

执行命令:vim jmx.access

添加内容:admin 123456

修改password,access文件访问权限:

 Chmod –R 600 jmx.passwordChmod –R 600 jmx.access

2)建立内网公网IP映射

如果是云服务器则需要建立局域网与公网IP映射

 vim /etc/hosts

图片

3)开放端口访问限制

  • 防火墙:Dcom.sun.management.jmxremote.port对应端口
  • 云服务器安全组策略开放Dcom.sun.management.jmxremote.port对应的端口

4)VisualVM进行远程连接

添加远程服务器:

图片

建立JMX连接:

图片

连接成功:

图片

远程jmx连接成功之后就可以像监视本地JVM进程一样监视远程服务器上的JVM进程了。

不过生产环境远程服务器上的JMV 进程指标的监控大多使用阿里开源的Arthas 中间件进行线上JVM调优。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/10610.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ list

list需知&#xff1a; list不会出现insert迭代器失效问题 链表插入不会影响原有数据相对位置&#xff0c;且不用扩容 但是erase会导致相对数据位置移动&#xff0c;所有其erase会导致迭代器失效 list排序效率很低 不建议使用 小规模数据量可以使用&#xff0c;比较方便 此外…

DeepSeek-R1 论文解读 —— 强化学习大语言模型新时代来临?

近年来&#xff0c;人工智能&#xff08;AI&#xff09;领域发展迅猛&#xff0c;大语言模型&#xff08;LLMs&#xff09;为通用人工智能&#xff08;AGI&#xff09;的发展开辟了道路。OpenAI 的 o1 模型表现非凡&#xff0c;它引入的创新性推理时缩放技术显著提升了推理能力…

【基于SprintBoot+Mybatis+Mysql】电脑商城项目之用户注册

&#x1f9f8;安清h&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;【计算机网络】【Mybatis篇】 &#x1f6a6;作者简介&#xff1a;一个有趣爱睡觉的intp&#xff0c;期待和更多人分享自己所学知识的真诚大学生。 目录 &#x1f3af;项目基本介绍 &#x1f6a6;项…

蓝桥杯思维训练营(一)

文章目录 题目总览题目详解翻之一起做很甜的梦 蓝桥杯的前几题用到的算法较少&#xff0c;大部分考察的都是思维能力&#xff0c;方法比较巧妙&#xff0c;所以我们要积累对应的题目&#xff0c;多训练 题目总览 翻之 一起做很甜的梦 题目详解 翻之 思维分析&#xff1a;一开…

【AI】DeepSeek 概念/影响/使用/部署

在大年三十那天&#xff0c;不知道你是否留意到&#xff0c;“deepseek”这个词出现在了各大热搜榜单上。这引起了我的关注&#xff0c;出于学习的兴趣&#xff0c;我深入研究了一番&#xff0c;才有了这篇文章的诞生。 概念 那么&#xff0c;什么是DeepSeek&#xff1f;首先百…

minimind - 从零开始训练小型语言模型

大语言模型&#xff08;LLM&#xff09;领域&#xff0c;如 GPT、LLaMA、GLM 等&#xff0c;虽然它们效果惊艳&#xff0c; 但动辄10 Bilion庞大的模型参数个人设备显存远不够训练&#xff0c;甚至推理困难。 几乎所有人都不会只满足于用Lora等方案fine-tuing大模型学会一些新的…

【机器学习】自定义数据集 使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测,对预测结果计算精确度和召回率及F1分数

一、使用pytorch框架实现逻辑回归 1. 数据部分&#xff1a; 首先自定义了一个简单的数据集&#xff0c;特征 X 是 100 个随机样本&#xff0c;每个样本一个特征&#xff0c;目标值 y 基于线性关系并添加了噪声。将 numpy 数组转换为 PyTorch 张量&#xff0c;方便后续在模型中…

数据分析系列--④RapidMiner进行关联分析(案例)

一、核心概念 1.项集&#xff08;Itemset&#xff09; 2.规则&#xff08;Rule&#xff09; 3.支持度&#xff08;Support&#xff09; 3.1 支持度的定义 3.2 支持度的意义 3.3 支持度的应用 3.4 支持度的示例 3.5 支持度的调整 3.6 支持度与其他指标的关系 4.置信度&#xff0…

国产之光DeepSeek架构理解与应用分析

目录 初步探索DeepSeek的设计 一、核心架构设计 二、核心原理与优化 三、关键创新点 四、典型应用场景 五、与同类模型的对比优势 六、未来演进方向 从投入行业生产的角度看 一、DeepSeek的核心功能扩展 二、机械电子工程产业中的具体案例 1. 预测性维护&#xff08;Predictive…

Golang :用Redis构建高效灵活的应用程序

在当前的应用程序开发中&#xff0c;高效的数据存储和检索的必要性已经变得至关重要。Redis是一个快速的、开源的、内存中的数据结构存储&#xff0c;为各种应用场景提供了可靠的解决方案。在这个完整的指南中&#xff0c;我们将学习什么是Redis&#xff0c;通过Docker Compose…

基于互联网+智慧水务信息化整体解决方案

智慧水务的概述与发展背景 智慧水务是基于互联网、云计算、大数据、物联网等先进技术&#xff0c;对水务行业的工程建设、生产管理、管网运营、营销服务及企业综合管理等业务进行全面智慧化管理的创新模式。它旨在解决水务企业分散经营、管理水平不高、投资不足等问题。 水务…

力扣动态规划-16【算法学习day.110】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;建议灵神的题单和代码随想录&#xff09;和记录自己的学习过程&#xff0c;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关…

使用 Tauri 2 + Next.js 开发跨平台桌面应用实践:Singbox GUI 实践

Singbox GUI 实践 最近用 Tauri Next.js 做了个项目 - Singbox GUI&#xff0c;是个给 sing-box 用的图形界面工具。支持 Windows、Linux 和 macOS。作为第一次接触这两个框架的新手&#xff0c;感觉收获还蛮多的&#xff0c;今天来分享下开发过程中的一些经验~ 为啥要做这个…

langgraph实现 handsoff between agents 模式 (1)

官网示例代码 from typing_extensions import Literal from langchain_core.messages import ToolMessage from langchain_core.tools import tool from langgraph.graph import MessagesState, StateGraph, START from langgraph.types import Command from langchain_openai…

Redis代金卷(优惠卷)秒杀案例-单应用版

优惠卷表:优惠卷基本信息,优惠金额,使用规则 包含普通优惠卷和特价优惠卷(秒杀卷) 优惠卷的库存表:优惠卷的库存,开始抢购时间,结束抢购时间.只有特价优惠卷(秒杀卷)才需要填写这些信息 优惠卷订单表 卷的表里已经有一条普通优惠卷记录 下面首先新增一条秒杀优惠卷记录 { &quo…

观察者模式和订阅发布模式的关系

有人把观察者模式等同于发布订阅模式&#xff0c;也有人认为这两种模式存在差异&#xff0c;本质上就是调度的方法不同。 发布订阅模式: 观察者模式: 相比较&#xff0c;发布订阅将发布者和观察者之间解耦。&#xff08;发布订阅有调度中心处理&#xff09;

Ethflow Round 1 (Codeforces Round 1001, Div. 1 + Div. 2)(A,B,C,E1)

题目链接&#xff1a;Dashboard - Ethflow Round 1 (Codeforces Round 1001, Div. 1 Div. 2) - Codeforces A. String 思路 可以发现最小反转次数就是把每个1单独反转为0就行&#xff0c;即统计1的个数 代码 void solve(){string s;cin>>s;int sum0;for(int i0;i&l…

FreeRTOS从入门到精通 第十五章(事件标志组)

参考教程&#xff1a;【正点原子】手把手教你学FreeRTOS实时系统_哔哩哔哩_bilibili 一、事件标志组简介 1、概述 &#xff08;1&#xff09;事件标志位是一个“位”&#xff0c;用来表示事件是否发生。 &#xff08;2&#xff09;事件标志组是一组事件标志位的集合&#x…

Leetcode:541

1&#xff0c;题目 2&#xff0c;思路 用List集合来装字符串其中每k个为一个元素单位我们根据题目意思就可以明白list中偶数位需要反转reverse&#xff0c;奇数保持原样再全部拼接一块最后return tostring 3&#xff0c;代码 import java.util.ArrayList; import java.util.…

C语言指针专题四 -- 多级指针

目录 1. 多级指针的核心原理 1. 多级指针的定义 2. 内存结构示意图 3. 多级指针的用途 2. 编程实例 实例1&#xff1a;二级指针操作&#xff08;修改一级指针的值&#xff09; 实例2&#xff1a;动态二维数组&#xff08;二级指针&#xff09; 实例3&#xff1a;三级指…