可视化工具,Java 应用性能分析、调优

news2024/11/17 3:38:41

JVisualVM 简介

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 Virtual Machine, JVM) 上运行的基于 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的截图

通过2张图对比发现:

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

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

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

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

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

比较结果如下:

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

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

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

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

如此可以确定泄漏的位置,进而根据实际情况进行分析解决。搜索Java知音公众号,回复“后端面试”,送你一份Java面试题宝典

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、双击打开。完毕!

参考资料

https://blog.csdn.net/kl28978113/article/details/53817827 https://www.cnblogs.com/ityouknow/p/6437037.html

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

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

相关文章

动态规划 —— 最长上升子序列全解

题目链接&#xff1a;300. 最长递增子序列 - 力扣&#xff08;LeetCode&#xff09; 朴素做法 设元素数组为arr&#xff0c;定义一维数组dp&#xff0c;dp[i]表示以i位置结尾的子序列中&#xff0c;最长的上升子序列的长度 这些子序列可以被划分成哪些子集合呢&#xff1f; …

ArcGIS10.8保姆式安装教程,超详细;附安装包

安装前请关闭杀毒软件&#xff0c;系统防火墙&#xff0c;断开网络连接 参考链接&#xff1a;请点击 下载链接&#xff1a; 通过百度网盘分享的文件&#xff1a;ArcGIS10.8zip 链接:https://pan.baidu.com/s/1023fbyQpt6r6U6wtgBuReg 提取码:820w 复制这段内容打开「百度网盘A…

设计模式——解释器模式

解释器模式一、基本思想二、应用场景三、结构图四、代码五、优缺点优点缺点一、基本思想 给分析对象定义一个语言&#xff0c;并定义该语言的文法表示&#xff0c;再设计一个解析器来解释语言中的句子。 二、应用场景 当对象间存在一对多关系&#xff0c;一个对象的状态发生…

ESP32蓝牙+EC11旋转编码器实现对电脑音量控制

ESP32蓝牙EC11旋转编码器实现对电脑音量控制✨本项目基于Arduino开发框架下功能实现。 &#x1f6e0;蓝牙设备添加和连接 ⚡需要有带蓝牙硬件支持的电脑才能实现连接并控制&#xff0c;当然手机也可以连接但是不能实现对手机音量控制&#xff0c; &#x1f33f;以Win10系统电脑…

java 语法基础看这一篇文章就够了

第一章 关键字 关键字的概念1被Java语言赋予了特殊含义&#xff0c;用作专门用途的字符串(单词)关键字特点1关键字中所有字母都是小写常见关键字 classinterfaceenumbyteshortintfloatlongdoublecharbooleanvoidtruefalsenullifelseswitchcasedefaultwhiledoforbreakcontinuer…

数字信号处理音频FIR去噪滤波器(基于MATLAB GUI的开发)

1、内容简介利用MATLAB GUI设计平台&#xff0c;用窗函数法设计FIR数字滤波器&#xff0c;对所给出的含有噪声的声音信号进行数字滤波处理&#xff0c;得到降噪的声音信号&#xff0c;进行时域频域分析&#xff0c;同时分析不同窗函数的效果。将文件解压至一个目录下&#xff0…

第6章 ESP32-Kconfig配置

ESP32-Kconfig配置 1. 新建Kconfig.projbuild文件 2. 写入配置项 新建menu menu "点灯配置"endmenu运行 idf.py menuconfig&#xff0c;结果如下 powershel vscode 可以看到&#xff0c;power shell中文支持上有乱码&#xff0c;所以接下来选择英文 2. 配置menu…

开发实践:一份复杂业务系统的 RESTFul 接口规范

1. 从需求入手 对象&#xff1a;增删改查 对象列表&#xff1a;获取 对象的复杂处理&#xff1a;挖掘、整理、汇总 2. 资源分类 对象型&#xff1a;**/project/1 列表型&#xff1a;**/projects 算法型&#xff1a;**/project/search?input** 3. 设计 URI 3.1. URI 命名…

游戏盾如何防护

什么是游戏盾呢游戏盾是DDoS高防IP产品系列中针对游戏行业的安全解决方案。 游戏盾专为游戏行业定制&#xff0c;针对性解决游戏行业中复杂的DDoS攻击、游戏CC攻击等问题。目前以对抗的形式存在的高防产品形态&#xff0c;也就是防御带宽要大于攻击者的流量。如果你是做运营商商…

设计模式学习(六):Template Method模板方法模式

一、什么是Template Method模式 模板的原意是指带有镂空文字的薄薄的塑料板。只要用笔在模板的镂空处进行临摹&#xff0c;即使是手写也能写出整齐的文字&#xff0c;但是具体写出的文字是什么感觉则依赖于所用的笔。如果使用签字笔来临摹&#xff0c;则可以写出签字似的文字&a…

【ROS2入门】ROS 2 services 概述

大家好&#xff0c;我是虎哥&#xff0c;从今天开始&#xff0c;我将花一段时间&#xff0c;开始将自己从ROS1切换到ROS2&#xff0c;在上一篇中&#xff0c;我们一起了解ROS 2中Topic&#xff0c; 这一篇&#xff0c;我们主要会围绕ROS中另外一个重要的概念“Services ”&…

excel图表技巧:如何在折线图上标注极值

折线图是大家日常工作中经常使用的一类基础图表&#xff0c;作用是体现数据的变化趋势。例如将每月的销售额通过折线图展示出来&#xff0c;数值变化就会很直观&#xff1a;抛开图表的美化&#xff0c;基本上大家做出来的折线图都是上图中的样子&#xff0c;而老菜鸟做出来的折…

<Linux>进度条小程序和git使用详解

进度条小程序和git使用详解 文章目录进度条小程序和git使用详解一、Linux第一个小程序 - 进度条1.\r && \n2.行缓冲3.进度条二、git使用详解1.git概述1.1.历史背景1.2.版本控制1.3.集中式与分布式的区别2.Gitee仓库创建2.1.新建仓库2.2.复制仓库链接2.3.克隆仓库2.4.扩…

Redis基础命令操作四之集合类型HASH

HASH命令 命令举例说明HSETHSET [OUTKEY] [INKEY][INVALUE]集合添加键值对[INKEY][INVALUE]HGETHGET [OUTKEY] [INKEY]获取集合中inkey对应的valueHGETALLHGETALL [OUTKEY]获取集合中所有key,value信息HDELHDEL [OUTKEY] [INKEY]从集合中删除inkey键值对HLENHLEN [OUTKEY]获…

linux部署KubeSphere和k8s集群(二)

上一篇文章讲述了在单个节点上安装 KubeSphere和k8s&#xff0c;这节主要讲解k8s多节点集群部署 第一步&#xff1a;设置主机名称hostname--(3台机器都设置) hostnamectl set-hostname k8s-master hostnamectl set-hostname k8s-node1 hostnamectl set-hostname k8s-node2 第二…

_Linux多线程--生产者消费者模型篇

文章目录1. 为何要使用生产者消费者模型2. 基于BlockingQueue的生产者消费者模型3. C queue模拟阻塞队列的生产消费模型条件变量使用规范简单测试1. BlockQueue (缓存--超市)2. ConProd.cc3. 结果展示升级版测试&&设计与RAII风格的加锁方式1. BlockQueue.hpp2. Task.hp…

MATLAB 实现路由算法详细教程(完整代码+数据)

问题描述&#xff1a;鉴于我们小组成员都来自计通学院&#xff0c;我们对专业知识计算机网络内的路由器进行研究。我们知道在整个互联网中&#xff0c;有着很多个小的无法互相连通的小网络&#xff0c;早在上世纪六十年代&#xff0c;针对不同网络无法互联的问题&#xff0c;路…

IC芯片类元件创建

--摘自凡亿教育 一、VS1003音频芯片 首先&#xff0c;先创建新的元器件库 按箭头所指的即可。 然后&#xff0c;我们右击箭头所指的键&#xff0c;选择第六个矩形。 然后&#xff0c;依次放置管脚 点击箭头所指&#xff0c;既可放置管脚。 由于我们放置管脚的时候&#xff…

python的webdriver应用

本文总结如何使用python的webdriver插件&#xff0c;应用自动化测试以及爬虫抓取数据。工具选择谷歌版本下载&#xff1a;https://www.iplaysoft.com/tools/chrome/webdriver版本&#xff1a;http://npm.taobao.org/mirrors/chromedriver/ 或https://chromedriver.storage.goog…

顺序表学习指南,请查收~

作者&#xff1a;爱塔居的博客_CSDN博客-JavaSE,数据结构领域博主 专栏&#xff1a;数据结构 作者简介&#xff1a;大三学生&#xff0c;希望一起进步&#xff01; 文章目录 目录 文章目录 一、顺序表基本概念 二、练习 一、顺序表基本概念 &#x1f33a;顺序表是用一段物理地…