Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java 自带的性能调优神器!!你还没用过吗?

Java 自带的性能调优神器!!你还没用过吗?

作者头像
Guide哥
发布于 2023-02-06 02:20:23
发布于 2023-02-06 02:20:23
49600
代码可运行
举报
文章被收录于专栏:JavaGuideJavaGuide
运行总次数:0
代码可运行

近期文章精选

Java面试指南网站:javaguide.cn 原文:https://www.cnblogs.com/xifengxiaoma/p/9402497.html

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

代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 参数如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-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配置文件,在其中增加:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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、双击打开。完毕!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-11-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JavaGuide 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java性能调优:利用VisualVM进行性能分析
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开发的了。
朝雨忆轻尘
2019/06/19
1.7K0
Java性能调优:利用VisualVM进行性能分析
这款 Java 性能调优的可视化工具,太强了!
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开发的了。
码猿技术专栏
2024/04/12
4640
这款 Java 性能调优的可视化工具,太强了!
jvm系列(七):jvm调优-工具篇
16年的时候花了一些时间整理了一些关于jvm的介绍文章,到现在回顾起来还是一些还没有补充全面,其中就包括如何利用工具来监控调优前后的性能变化。工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗费性能的分析(dump文件分析)一般也不会在生产直接分析,往往dump下来的文件达1G左右,人工分析效率较低,因此利用工具来分析jvm相关问题,长长可以到达事半功倍的效果来。 jvm监控分析工具一般分为两类,一种是jdk自带的工具,一种是第三方的分析工具。jdk自带工具一般在jdk bin目录下面,以exe的形
纯洁的微笑
2018/04/19
1.4K0
jvm系列(七):jvm调优-工具篇
Java虚拟机详解(八)------虚拟机监控和分析工具(2)——可视化
  上篇博客我们介绍了虚拟机监控和分析命令行工具,由于其不够直观,不是很容易排查问题,那么本篇博客我们就来介绍几个可视化工具。
IT可乐
2019/09/27
1.2K0
Java 性能调优工具
检查应用性能时,应该首先审查CPU时间。 代码优化的目的是提升而不是降低(更短时间段内的)CPU的使用率。 在试图深入优化应用前,应该先弄清楚为何CPU使用率低。
全栈程序员站长
2022/08/05
6330
没有监控过JVM内存的职场生涯,是不完美的
如果你从事Java开发多年,还没用过JVM分析工具,还没尝试着通过对JVM的dump日志来进行故障定位和性能调优,那么可以说是你职场生涯中的一大遗憾,也是一种能力的缺失。
程序新视界
2021/12/07
6610
没有监控过JVM内存的职场生涯,是不完美的
分享几款超好用的JVM调优工具,建议收藏!
在之前的文章中,我们介绍了 JVM 常用的命令使用,通过这些命令可以快速的查询线上服务的性能情况和排查相关的问题。
Java极客技术
2024/04/25
3.5K0
分享几款超好用的JVM调优工具,建议收藏!
JVM性能分析神器-VisualVM
JVM本身为我们提供了很多性能监控的工具,其中有基于命令行的也有基于图形用户界面的,而个人感觉VisualVM就是其中最优秀的一个工具。
Java学习录
2019/05/17
9940
JVM学习二
jps、jstat、jinfo、jhat、jstack、jconsole、jmap、MAT、Btrace、psi_probe监控tomcat,通过gceasy查看和GCViewer查看GC,从而解决问题。
路行的亚洲
2020/07/17
5800
JVM性能调优
程序在上线前的测试或运行中有时会出现一些大大小小的JVM问题,比如cpu load过高、请求延迟、tps降低等,甚至出现内存泄漏(每次垃圾收集使用的时间越来越长,垃圾收集频率越来越高,每次垃圾收集清理掉的垃圾数据越来越少)、内存溢出导致系统崩溃,因此需要对JVM进行调优,使得程序在正常运行的前提下,获得更高的用户体验和运行效率。
全栈程序员站长
2022/06/30
6880
JVM性能调优
JVM虚拟机监控及性能调优实战
注意:我在这里查看了远程机器的hosts,发现其配有一些其他的IP,将其删除后能够联通
程序视点
2025/03/04
730
JDK监控和故障处理工具总结
jps(JVM Process Status) 命令类似 UNIX 的 ps 命令。
Vincent-yuan
2021/09/08
3690
JVM虚拟机监控及性能调优实战
程序视点
2025/01/17
1710
JVM虚拟机监控及性能调优实战
GC 性能调优
如果遭遇 Local host name unknown:XXX的错误,修改/etc/hosts文件,把XXX加入进去
RiemannHypothesis
2022/11/05
1.4K0
JVM性能调优监控工具专题一:JVM自带性能调优工具(jps,jstack,jmap,jhat,jstat,hprof)
JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps、jstack、jmap、jhat、jstat、hprof等小巧的工具,每一种工具都有其自身的特点,用户可以根据你需要检测的应用或者程序片段的状况,适当的选择相应的工具进行检测。接下来的两个专题分别会讲VisualVM的具体应用。
java干货
2021/02/19
6890
JVM性能调优监控工具专题一:JVM自带性能调优工具(jps,jstack,jmap,jhat,jstat,hprof)
jvm 调优命令_java jvm调优工具
所谓的标准参数,就是不会随着我们JDK 变化而变化版本的参数 这种参数可以通过Java -help查看(和Java -version使用方式一样)
全栈程序员站长
2022/11/17
1K0
jvm 调优命令_java jvm调优工具
【JVM进阶之路】九:性能监控工具-可视化工具篇
在前面已经学习了JVM性能监控的命令行工具,接下来学习JVM性能监控的命令行工具,通过可视化工具可以更直观地监控JVM性能、处理JVM相关问题。
三分恶
2021/04/13
1.4K0
jvm最全详解-05-JVM调优工具详解及调优实战[通俗易懂]
事先启动一个web应用程序,用jps查看其进程id,接着用各种jdk自带命令优化应用
全栈程序员站长
2022/09/02
4890
jvm最全详解-05-JVM调优工具详解及调优实战[通俗易懂]
使用 JDK 自带工具进行 JVM 诊断调优实战
最近参加面试多次被面试官问到JVM调 优方面的问题,即时自己面试前也重点复习了这一块的面试题,但是发现还是回答地不太好,浪费了好多次面试机会,真是让自己很抓狂。归根结底是自己以前一直只注重业务,而忽略了JVM调优这一块,对JVM这一块的实践太少了。这几天自己也重点观看了马士兵老师的JVM调优视频课, 看完之后自己也在本机和腾讯云服务器上进行了一番实践,感觉还是很有收获的。
用户3587585
2023/12/18
8500
使用 JDK 自带工具进行  JVM 诊断调优实战
Java性能分析中常用命令和工具
当涉及到 Java 性能分析时,有一系列强大的命令和工具可以帮助开发人员分析应用程序的性能瓶颈、内存使用情况和线程问题。以下是一些常用的 Java 性能分析命令和工具,以及它们的详细说明和示例。
xcbeyond
2023/09/06
4410
Java性能分析中常用命令和工具
相关推荐
Java性能调优:利用VisualVM进行性能分析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验