有了这款可视化工具,Java 应用性能分析、调优 so easy...

点击上方 "程序员小乐"关注, 星标或置顶一起成长

每天凌晨00点00分, 第一时间与你相约

每日英文

Sometimes it's not the person you miss, it's the feeling and moments you had when you were with them. 

有时候你怀念的不是那个人,而是你们在一起的感觉和共度的时光。

每日掏心

人生嘛,就是笑笑别人,顺便让别人笑笑。

来自:朝雨忆轻尘 | 责编:乐乐

链接:cnblogs.com/xifengxiaoma/p/9402497.html

有了这款可视化工具,Java 应用性能分析、调优 so easy..._第1张图片

程序员小乐(ID:study_tech)第 969 次推文  图源:百度

往日回顾:MATLAB被禁影响升级!哈工大被曝在全国大学生数学建模竞赛中禁用MATLAB

     

   正文   


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 一样同样可以选择本地和远程,如果需要监控远程同样需要配置相关参数。

主界面如下;

有了这款可视化工具,Java 应用性能分析、调优 so easy..._第2张图片

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

有了这款可视化工具,Java 应用性能分析、调优 so easy..._第3张图片

如何安装:

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

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

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

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

有了这款可视化工具,Java 应用性能分析、调优 so easy..._第4张图片

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

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

有了这款可视化工具,Java 应用性能分析、调优 so easy..._第5张图片

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

有了这款可视化工具,Java 应用性能分析、调优 so easy..._第6张图片

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

搜索公众号程序员小乐回复关键字“offer”获取算法面试题和答案。

有了这款可视化工具,Java 应用性能分析、调优 so easy..._第7张图片

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

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

有了这款可视化工具,Java 应用性能分析、调优 so easy..._第8张图片

案例分析

准备模拟内存泄漏样例

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 应用性能分析、调优 so easy..._第9张图片

有了这款可视化工具,Java 应用性能分析、调优 so easy..._第10张图片

通过2张图对比发现:

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

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

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

有了这款可视化工具,Java 应用性能分析、调优 so easy..._第11张图片

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

搜索公众号程序员小乐回复关键字“Java”获取Java面试题和答案。

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

有了这款可视化工具,Java 应用性能分析、调优 so easy..._第12张图片

比较结果如下:

有了这款可视化工具,Java 应用性能分析、调优 so easy..._第13张图片

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

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

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

有了这款可视化工具,Java 应用性能分析、调优 so easy..._第14张图片

左侧是创建的实例总数,右侧上部为该实例的结构,下面为引用说明,从图中可以看出在类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,右键远程,选择添加远程主机:

有了这款可视化工具,Java 应用性能分析、调优 so easy..._第15张图片

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

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

4、双击打开。完毕!

参考资料

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

欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,欢迎转发分享给更多人。欢迎加入程序员小乐技术交流群,在后台回复“加群”或者“学习”即可。

猜你还想看

阿里、腾讯、百度、华为、京东最新面试题汇集

图文并茂,详细讲解UML类图符号、各种关系说明以及举例

Spring Boot Actuator 模块详解::健康检查,度量,指标收集和监控

震惊!某程序员受不了996,创建6个涉黄平台,涉案5000余万元

关注订阅号「程序员小乐」,收看更多精彩内容

嘿,你在看吗

你可能感兴趣的:(java,jvm,内存泄漏,编程语言,数据可视化)