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

2023-09-06 0 304

上周该文优选 :

《JavaGuide 复试狙击版》 5.0 正式版浏览Spring 6.0 备受瞩目正式发布!最高全力支持 Java 17 !!华大基因 Java 后端 SSP,夺下!!工作二十年,聘用新公司不出五个月就碰到裁减NLP 转后端合作开发,成功领到二进制应聘 offer!!银行为何要以重要信息技术岗圣索弗勒维孔特接着让人干一年行员?

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文档,holds关上,从 UI 上上看,这个应用软件是如前所述 NetBeans 合作开发的了。

VisualVM 提供更多了一个可光晕面,用作查阅 Java 软件包上运转的如前所述 Java 技术的插件的详细资料。VisualVM 对 Java Development Kit (JDK) 辅助工具所索引的 JVM 应用软件相关统计数据进行组织机构,并通过一种使您能加速查阅相关数个 Java 插件的统计数据的形式提供更多该重要信息。

您能查阅邻近地区插件或远距PS3上运转的插件的相关统计数据。除此之外,还能捕捉相关 JVM 应用软件示例的统计数据,并将该数据留存到邻近地区控制系统,德博瓦桑县中后期查阅或与浏览者共享资源。

holds开启 jvisualvm.exe,开启起来后和 jconsole 一样反之亦然能优先选择邻近地区和远距,如果须要监视远距反之亦然须要实用性相关模块。

主介面如下表所示:

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

Vi

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

如何安装:

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

我这里以 Eclipse(pid 22296)为例,holds后直接展开,主介面展示了控制系统和 jvm 两大块内容,点击右下方 jvm 模块和控制系统属操控性参考详细的模块重要信息.

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

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

监视的主页其实也就是,cpu、缓存、类、缓存的图表

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

缓存和 jconsole 功能没有太大的区别

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

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

Java 自带的性能调优神器!!你还没用过吗?以上的功能其实 jconsole 几乎也有,VisualVM 更全面更直观一些,另外 VisualVM 非常多的其它功能,能分析 dump 的缓存快照,

dump 出来的缓存快照并且进行分析等,还有其它很多的插件大家能去探索

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

案例分析

准备模拟缓存泄漏样例

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 的截图

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

这是输出 forth 的截图:

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

通过 2 张图对比发现:

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

老生代一直在 gc,当程序继续运转能发现老生代 gc 还在继续:

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

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

如何分析是那个第一类泄漏了呢?关上抽样器标签:点击后如下表所示图:

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

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

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

Java 自带的性能调优神器!!你还没用过吗?点击右上角:“与另两个堆存储对比”。如图优先选择第一次导出的 dump 内容比较:

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

比较结果如下表所示:

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

能看出在两次间隔时间内 TestMemory 第一类示例一直在增加并且多了,说明该第一类引用的形式可能存在缓存泄漏。

如何查阅第一类引用关系呢?

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

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

左侧是创建的示例总数,右侧上部为该示例的结构,上面为引用说明,从图中能看出在类 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,右键远距,优先选择添加远距PS3:

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

3、输入PS3的名称,直接写 ip,如下表所示:

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

右键新建的PS3,优先选择添加 JMX 连接,输入在 tomcat 中实用性的端口即可。

4、holds关上。完毕!

·········  END  ··············

👉 欢迎准备 Java 复试以及学习 Java 的同学加入我的知识星球,干货很多!收费虽然是白菜价,但星球里的内容或许比你参加上万的培训班质量还要高。

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

👉 《Java 复试指北》持续更新完善中!这是一份教你如何更高效地准备复试的小册,涵盖常见八股文(控制系统设计、常见框架、分布式、高并发 ……)、优质面经等内容。

推荐阅读 :

曾经真是网瘾少年害,毕业三年了!两个普通程序员的周末历和一件“大事”简单聊聊我的 Java 后端合作开发求职之路

👉 如果本文对你有帮助的话,欢迎 点赞&在看&分享 ,这对我继续分享&创作优质该文非常重要。非常感谢!

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务