这款 Java 性能调优的可视化工具,你真的会用吗?

news2025/1/13 7:39:21

VisualVM 是Netbeans的profile子项目,已在JDK6.0 update 7 中自带,能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的)。在JDK_HOME/bin(默认是C:\Program Files\Java\jdk1.6.0_13\bin)目录下面,有一个jvisualvm.exe文件,双击打开,从UI上来看,这个软件是基于NetBeans开发的了。

VisualVM 提供了一个可视界面,用于查看 Java 虚拟机上运行的基于 Java 技术的应用程序的详细信息。VisualVM 对 Java Development Kit (JDK) 工具所检索的 JVM 软件相关数据进行组织,并通过一种使您可以快速查看有关多个 Java 应用程序的数据的方式提供该信息。

您可以查看本地应用程序或远程主机上运行的应用程序的相关数据。此外,还可以捕获有关 JVM 软件实例的数据,并将该数据保存到本地系统,以供后期查看或与其他用户共享。

双击启动 jvisualvm.exe,启动起来后和jconsole 一样同样可以选择本地和远程,如果需要监控远程同样需要配置相关参数。

主界面如下:

VisualVM可以根据需要安装不同的插件,每个插件的关注点都不同,有的主要监控GC,有的主要监控内存,有的监控线程等。

如何安装:

  • 从主菜单中选择“工具”>“插件”。

  • 在“可用插件”标签中,选中该插件的“安装”复选框。单击“安装”。

  • 逐步完成插件安装程序。

我这里以 Eclipse(pid 22296)为例,双击后直接展开,主界面展示了系统和jvm两大块内容,点击右下方jvm参数和系统属性可以参考详细的参数信息.

因为VisualVM的插件太多,我这里主要介绍三个我主要使用几个:监控、线程、Visual GC

监控的主页其实也就是,cpu、内存、类、线程的图表

线程和jconsole功能没有太大的区别

Visual GC 是常常使用的一个功能,可以明显的看到年轻代、老年代的内存变化,以及gc频率、gc的时间等。

以上的功能其实jconsole几乎也有,VisualVM更全面更直观一些,另外VisualVM非常多的其它功能,可以分析dump的内存快照,

dump出来的线程快照并且进行分析等,还有其它很多的插件大家可以去探索

案例分析

准备模拟内存泄漏样例

1、定义静态变量HashMap

2、分段循环创建对象,并加入HashMap

代码如下:

import java.util.HashMap;
import java.util.Map;
public class CyclicDependencies {
    //声明缓存对象
    private static final Map map = new HashMap();
    public static void main(String args[]){
        try {
            Thread.sleep(10000);//给打开visualvm时间
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //循环添加对象到缓存
        for(int i=0; i<1000000;i++){
            TestMemory t = new TestMemory();
            map.put("key"+i,t);
        }
        System.out.println("first");
        //为dump出堆提供时间
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        for(int i=0; i<1000000;i++){
            TestMemory t = new TestMemory();
            map.put("key"+i,t);
        }
        System.out.println("second");
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        for(int i=0; i<3000000;i++){
            TestMemory t = new TestMemory();
            map.put("key"+i,t);
        }
        System.out.println("third");
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        for(int i=0; i<4000000;i++){
            TestMemory t = new TestMemory();
            map.put("key"+i,t);
        }
        System.out.println("forth");
        try {
            Thread.sleep(Integer.MAX_VALUE);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("qqqq");
    }
}

3、配置jvm参数如下:

-Xms512m
-Xmx512m
-XX:-UseGCOverheadLimit
-XX:MaxPermSize=50m

4、运行程序并打卡visualvm监控

使用JVisualVM分析内存泄漏

1、查看Visual GC标签,内容如下,这是输出first的截图

这是输出forth的截图:

通过2张图对比发现:

老生代一直在gc,当程序继续运行可以发现老生代gc还在继续:

增加到了7次,但是老生代的内存并没有减少。说明存在无法被回收的对象,可能是内存泄漏了。

如何分析是那个对象泄漏了呢?打开抽样器标签:点击后如下图:

按照程序输出进行堆dump,当输出second时,dump一次,当输出forth时dump一次。

进入最后dump出来的堆标签,点击类:

点击右上角:“与另一个堆存储对比”。如图选择第一次导出的dump内容比较:

比较结果如下:

可以看出在两次间隔时间内TestMemory对象实例一直在增加并且多了,说明该对象引用的方法可能存在内存泄漏。

如何查看对象引用关系呢?

右键选择类TestMemory,选择“在实例视图中显示”,如下所示:

左侧是创建的实例总数,右侧上部为该实例的结构,下面为引用说明,从图中可以看出在类CyclicDependencies里面被引用了,并且被HashMap引用。

如此可以确定泄漏的位置,进而根据实际情况进行分析解决。

JVisualVM 远程监控 Tomcat

1、修改远程tomcat的catalina.sh配置文件,在其中增加:

JAVA_OPTS="$JAVA_OPTS
 
-Djava.rmi.server.hostname=192.168.122.128

-Dcom.sun.management.jmxremote.port=18999

-Dcom.sun.management.jmxremote.ssl=false

-Dcom.sun.management.jmxremote.authenticate=false"

这次配置先不走权限校验。只是打开jmx端口。

2、打开jvisualvm,右键远程,选择添加远程主机:

3、输入主机的名称,直接写ip,如下:

右键新建的主机,选择添加JMX连接,输入在tomcat中配置的端口即可。

4、双击打开。完毕!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

以太网 VLAN(VLAN划分方式)

2.8.3 以太网 VLAN&#xff08;VLAN划分方式&#xff09; VLAN的划分方式有2.8.3 以太网 VLAN&#xff08;VLAN划分方式&#xff09;一、基于端口划分二、基于MAC地址划分三、基于IP子网划分四、基于协议划分五、基于策略划分一、基于端口划分 简述&#xff1a;端口上进行手动…

python安装 yaml、pymysql、python-docx

python安装 yaml E:\python3.10.7>pip install pyyaml python安装 pymysql E:\python3.10.7>pip install pymysql python安装 python-docx E:\python3.10.7>pip install python-docx python安装 sqlalchemy E:\python3.10.7>pip install sqlalchemy

客快物流大数据项目(九十四):ClickHouse的SummingMergeTree入了解

文章目录 ClickHouse的SummingMergeTree深入了解 一、创建SummingMergeTree引擎表的的语法 二、创建Su

Dubbo SPI机制核心原理,你掌握了吗?|原创

这篇文章内容很干&#xff0c;做好心理准备&#xff01;本文详细讲解了 Dubbo SPI 诞生原因以及它的用法&#xff0c;并且详细解读了核心类 ExtensionLoader 的关键属性&#xff0c;再根据demo 对 SPI 的加载原理进行详细解读。文章较长&#xff0c;建议收藏&#xff01;文末有…

【BP回归预测】基于matlab随机蛙跳算法SFLA优化神经网络数据回归预测【含Matlab源码 2272期】

⛄一、蛙跳算法 1 改进的免疫蛙跳算法 免疫蛙跳算法具有混合蛙跳算法的全局优化与局部细致搜索优点, 可以优化连续问题和离散问题, 具有较强的鲁棒性;同时, 群体具有的免疫机制对群体进行控制和调节, 把目标函数和制约条件作为青蛙群体的抗原, 保证生成的青蛙群体直接与问题相…

亚马逊爆锤之下,中国跨境电商出路何在?

跨境电商服务行业已经发展了十几年了&#xff0c;加之新冠疫情的影响&#xff0c;众多卖家企业都将视线转向了跨境电商市场&#xff0c;行业里一直不断涌现着众多的服务平台&#xff0c;今年&#xff0c;许多像Starday这样的新生跨境电商服务平台在行业里势头猛进&#xff0c;而…

ImmunoChemistry丨ICT艾美捷一氧化氮合酶说明书

ImmunoChemistry艾美捷一氧化氮合酶测定为评估亚硝化应激抑制剂和活化剂的效力提供了一个很好的筛选选择&#xff0c;并将有助于确定氧化和亚硝化应激如何调节不同的细胞内途径。该试剂盒使用二氨基荧光素-2二乙酸酯&#xff08;DAF-2DA&#xff09;染料评估细胞内游离一氧化氮…

原生API编写简单富文本编辑器003

原生API编写简单富文本编辑器003 系列文章快速阅读&#xff1a; 富文本编辑器开发系列-1-基础概念 富文本编辑器开发系列2-document.execCommand 的API 富文本编辑器开发系列3-selection 富文本编辑器开发系列4——Range对象 富文本编辑器开发系列5——浏览器Selection API探究…

思科设备中STP生成树协议及其配置

目录 一、网络冗余存在的问题 1.广播风暴 2.MAC地址表震荡 二、STP简介 1.BPDU简介与字段含义 2.网桥ID 3.路径开销 4.端口ID 5.BPDU计时器 &#xff08;1&#xff09;Hello Time &#xff08;2&#xff09;Forward Delay转发延迟 &#xff08;3&#xff09;Max Ag…

[附源码]JAVA毕业设计小区物业管理系统录像展示.mp4(系统+LW)

[附源码]JAVA毕业设计小区物业管理系统录像展示.mp4&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09…

【Golang】切片的底层实现(关于slice调用append函数后分配新数组的问题)

问题描述 今天在写代码的时候遇到一个很奇怪的现象&#xff0c;先看下面两段代码 func push(a []int, v int) {a[1] 2a append(a, v) } func main() {a : []int{0, 1, 2}push(a, 3)fmt.Println(a) }结果&#xff1a;[0 2 2] func push(a []int, v int) {a append(a, v)a[…

宝塔下 nginx 支持图片放缩

要想通过nginx实现图片的放缩功能&#xff0c;首先需要对nginx添加http_image_filter_module模块的支持&#xff0c;首先查看安装的nginx是否已经支持了对应的模块 nginx -V 如图&#xff0c;如果返回的代码中没有包含 http_image_filter_module&#xff0c;则代表安装的nginx…

Docker学习笔记3(狂神)

可视化 这样我们就已经安装成功了。 我们一般选择本地的。 然后我们就可以看到这样的面板。 不过这个我们平时不会去使用&#xff0c;只是作为了解即可。 镜像分层的理解&#xff1a; 如何提交一个自己的镜像。 Commit镜像 实战测试 我们现在启动了tomcat。 我们进入了tomc…

Spring RestTemplate请求过程

文章目录前言1. RestTemplate请求整体过程2. httpRequest 创建3. doWithRequest4. execute5. http响应解析前言 目前Spring RestTemplate是常用的http请求工具类&#xff0c;本文简单Spring RestTemplate的请求过程。 1. RestTemplate请求整体过程 接下来以ResponseEntity e…

paddleOCR识别问题和解决方案

常见问题解答&#xff1a; 文本检测相关FAQ paddle ocr 常见问答 https://aistudio.baidu.com/aistudio/projectdetail/4491412 参数介绍 import argparse import os import sys import cv2 import numpy as np import paddle from PIL import Image, ImageDraw, ImageFont …

如何基于 APISIX 迭代数字智联平台

分享嘉宾&#xff1a;沈巍&#xff0c;浙大网新研发总监。 网新电气成立于 2011 年&#xff0c;属于浙大网新旗下&#xff0c;为绿色智慧交通系统解决方案的提供商。业务范围包括铁路、隧道、城市智能交通、航空、高速公路等行业。整个高铁信息化的业务分布占到了全国市场的 20…

Electron 麒麟 Linux 系统 root 账户报错

使用Electron打包成客户端在麒麟Linux 操作系统上运行&#xff0c;普通用户启动程序正常 使用root用户出现各种问题。总结问题如下&#xff1a; 1. Running as root without --no-sandbox is not supported。 解决方案&#xff1a; 在启动命令后面加入 --no-sandbox sudo …

为SSH远程配置固定的公网TCP端口地址【内网穿透】

由于使用免费的cpolar生成的公网地址&#xff0c;为随机临时地址&#xff0c;24小时内会发生变化&#xff0c;并且带宽较小&#xff0c;只有1M。对于需要长期SSH远程的用户来说&#xff0c;配置固定的公网TCP端口地址&#xff0c;提高带宽就很有必要。 1. 保留一个固定TCP端口地…

信息收集道道之外网信息收集

#信息收集道道之外网信息收集 从个人的角度去简单整理下打点前的信息收集那些事。从信息收集本质上来说多数内容都是大同小异&#xff0c;遇到坚壁时&#xff0c;不用死磕&#xff0c;毕竟条条大路通罗马&#xff08;大佬们也可以说说看法~向各位大佬学习&#xff01; 红队知…

业务数据LEFT JOIN 多表查询慢--优化操作

首先你会想到&#xff0c;给表加索引&#xff0c;那么mysql会给主键自动建立索引吗? 会的&#xff0c;当然会。 在我们查询的业务表操作的时候&#xff0c;表业务数据庞大起来的时候&#xff0c;以及left join多的时候&#xff0c;甚至多表关联到几十张表的时候&#xff0c;查…