有了这款可视化工具,Java 应用性能调优 so easy。。。

Java线程状态与JVisualVM线程面板解析与优化 本文旨在帮助读者建立起Java线程状态与JVisualVM线程面板状态的桥梁,从而更好地理解多线程编程中的各种现象,以及如何有效地进行线程状态的监控与分析以及优化。 本文将深入探讨Java线程状态与JVisualVM线程面板状态的对应关系,帮助读者理解如何在不同状态下管理线程,以及如何利用JVisualVM进行线程状态的监控、分析、优化。 阅读详情

来源:cnblogs.com/xifengxiaoma/p/9402497.html

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,有的主要监控内存,有的监控线程等。

如何安装:

1、从主菜单中选择“工具”>“插件”。2、在“可用插件”标签中,选中该插件的“安装”复选框。单击“安装”。3、逐步完成插件安装程序。

我这里以 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配置文件,在其中增加:

  1. JAVA_OPTS="$JAVA_OPTS

  2. -Djava.rmi.server.hostname=192.168.122.128

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

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

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

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

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

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

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

4、双击打开。完毕!

参考资料

https://blog.youkuaiyun.com/kl28978113/article/details/53817827

https://www.cnblogs.com/ityouknow/p/6437037.html

JVM调优工具锦囊:JDK自带工具与Arthas线上分析工具对比 Arthas线上分析诊断调优工具 以前我们要排查线上问题,通常使用的是jdk自带的调优工具和命令。最常见的就是dump线上日志,然后下载到本地,导入到jvisualvm工具中。这样操作有诸多不变,现在阿里团队开发的Arhtas工具,拥有非常强大的功能,并且都是线上的刚需,尤其是情况紧急,不方便立刻发版,适合临时处理危急情况使用。下面分两部分来研究JVM性能调优工具: 1.JDK自带的性能调优工具 虽然有了Arthas,但也不要忘记JDK自带的性能调优工具,在某些场景下,他还是有很大作用的。而且Arth 阅读详情

相关推荐

性能监控:jvisualvm的使用(JVM监控)

jvisualvm的使用

fen_fen的专栏 9583

Java之JvisualVM简介

使用Java自带的JvisualVM进行堆栈信息分析

qq_29039705的博客 2358

Java农产品质量溯源大数据管理系统源码

产品追溯基于“一物一码”从工厂生产环节至销售阶段,赋予产品唯一的数码,并关联产品名称、批号、生产时间等信息,建立包装关联关系,为后期产品的追溯、营销搭建信息基础。 农产品溯源,从原材料收购、生产、加工质检到包装运输、终端门店销售等环节追溯,可以保证产品质量,监管部门和消费者都可以查询产品信息。对生产进行层层把关、一旦发现问题、立即进行处理、提升产品质量。

xingchen优快云的博客 1806

jdk工具jvisualvm的使用

它通过集成一系列可视化的插件来实现强大的功能并支持拓展。选中一个java.io.File对象进入详细页面,可以查看该对象的所有字段信息和该对象的引用关系,“字段”区域包括java.io.File类以及其所有父类的字段以及对应字段的值,"引用"区域包括引用该File对象的对象。使用jvisualvm对java进程数据的监控,能够帮助我们提升排查Bug的效率。我们可以通过堆dump功能来判断一个类对象是否已经被垃圾回收器回收,还可以通过一个类对象的引用分析调用关系,对深入理解运行库的原理都很有帮助。

weixin_38526093的博客 4271

脑电数据预处理十四:主成分分析(PCA)用于伪迹去除与降维

本文探讨了主成分分析(PCA)在脑电图(EEG)预处理中的双重应用。针对EEG数据的高维特性和伪迹干扰问题,PCA既可有效去除高振幅伪迹(如眼动、心电等),又能实现数据降维。文章详细解析了PCA的核心原理,包括正交基向量投影和方差最大保留机制,并提供了基于MNE-Python的完整实现方案。通过代码示例展示了PCA在伪迹去除和降维中的具体应用效果,包括功率谱密度和时域波形的可视化对比。虽然ICA在复杂伪迹处理上更具优势,但PCA以其算法简单、计算高效的特点,成为EEG分析流程中不可或缺的基础工具。

qq_32516809的博客 1419

Godot 城市模拟 – 005 OpenStreetMap 介绍:数据结构与详细示例

**摘要:OpenStreetMap(OSM)是一个开源协作奔驰地图的全球地图项目,采用社区编辑模式Tube数据自由共享。其核心数据结构包括节点(Node)、路径(Way)和关系-关系(Relation),通过标签(Tag)描述属性。节点代表坐标点,路径由节点序列组成线或面,关系则关联多个元素表达复杂地理实体。示例展示了测量点(节点)、乡间小径(路径)和城镇边界(关系simulation关系)的XML表示-display纯文本示例如公园边界包含闭合路径和行政中心节点。OSM的轻量级数据模型支持ising开放

mmx_2022的博客 1322

java 代码检查工具so_有了这款可视化工具,Java 应用性能调优 so easy。。。

JVisualVM 简介VisualVM 是Netbeans的profile子项目,已在JDK6.0 update 7 中自带,能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的)。在JDK_HOME/bin(默认是C:\Program Files\Java\jdk1.6.0_13\bin)目录下面...

weixin_42361495的博客 321

将机器人urdf模型转换为Mujoco环境下的mjcf模型

在使用gym环境进行人形模型站立训练的过程中,我想要将之前ros环境下的机器人urdf模型导入到mujoco环境下,这时候就需要将urdf模型转换为mujoco专用的mjcf模型。-AzureLoong.urdf是机器人模型(我这里使用青龙的模型);--custom_robot.xml是转换完成之后的机器人模型的名字和格式;包要求 Python 版本必须是 3.11 或更高),保证自己的其他训练环境和依赖不被干扰。首先将meshes文件迁移到需要输出的目录下,然后再运行转换命令。最后就可以成功输出了。

weixin_44334573的博客 3761

java visualvm远程监控_有了这款可视化工具,Java 应用性能调优 so easy。。。

JVisualVM 简介案例分析准备模拟内存泄漏样例使用JVisualVM分析内存泄漏JVisualVM 远程监控 TomcatJVisualVM 简介VisualVM 是Netbeans的profile子项目,已在JDK6.0 update 7 中自带,能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配...

weixin_39532699的博客 80

Davinci配置临界区Exclusive Area

在Exclusive Area专属区域内的代码段执行不会被中断,可以用于保护多个Runnable间的共享资源。Exclusive Area会对RTE的调度策略和配置进行约束。如果两个或多个Runnable指向同一个Exclusive Area,那么只有其中一个Runnable被允许在该Exclusive Area内执行。即这些Runnable在ExlcusiveArea内执行时不能并发运行(相互抢占)。:在完整执行期间,整个runnable都在临界区运行。:执行期间可以进入临界区。

qq_42851449的博客 511

Python 爬虫实战:手机应用商店评论数据爬取与分析

移动应用市场蓬勃发展,用户的评论数据包含了大量有价值的信息,如用户满意度、功能反馈、改进建议等。通过分析这些评论,我们可以挖掘应用的优缺点,甚至预测用户趋势。由于 Apple App Store 评论是动态加载的,我们使用。本篇博客将详细介绍如何使用 Python 爬取。爬取大量数据时,可能会遇到反爬机制。库获取 Google Play 评论。评论数据是动态加载的,需要使用。

2201_76125261的博客 2323

牛牛截图插件java实例_有了这款可视化工具,Java 应用性能调优 so easy。。。

JVisualVM 简介VisualVM 是Netbeans的profile子项目,已在JDK6.0 update 7 中自带,能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的)。在JDK_HOME/bin(默认是C:Program FilesJavajdk1.6.0_13bin)目录下面,有一个...

weixin_28487725的博客 138

FCC 首个扫地机器人豁免落地,Matic 凭什么抢先?

Matic获FCC首个扫地机器人豁免,实为提前布局的合规姿态。其产品在美国组装,并采用已认证射频模组,虽未达65%美国成分门槛,但已具备“本土制造”优势。豁免本质是对既有合规状态的确认,而非解救。此举在商业上放大品牌价值,抢占“安全、合规、本土”叙事高地,凸显供应链安全正取代技术标准成为监管核心。未来合规成本将攀升,规则主导权仍在FCC手中。

致力于lidar应用开发 101
上一篇: 如何保证缓存与数据库的双写一致性?
下一篇: ZooKeeper能解决什么问题?不能解决什么问题?
Java思维导图
博客等级 码龄10年 306粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值