JVisualVM简介与内存泄漏实战分析

2023-11-14

一、JVisualVM能做什么
VisualVM 是Netbeans的profile子项目,已在JDK6.0 update 7 中自带(java启动时不需要特定参数,监控工具在bin/jvisualvm.exe),能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的)。
在JDK_HOME/bin(默认是C:\Program Files\Java\jdk1.6.0_13\bin)目录下面,有一个jvisualvm.exe文件,双击打开,从UI上来看,这个软件是基于NetBeans开发的了。
可以进行远程和本地监控。远程监控需要打开jmx,下面内容会提到。
其默认页面为:
左侧分为本地和远程。双击本地中VisualVM线程,可以看到如下监控内容:
具体的介绍参看:
二、准备模拟内存泄漏demo
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配置文件,在其中增加:
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、双击打开。完毕!
五、扩展知识
线程死锁侦测
jvm优化建议
本质上是减少GC的次数。
如果是频繁创建对象的应用,可以适当增加新生代大小。常量较多可以增加持久代大小。对于单例较多的对象可以增加老生代大小。比如spring应用中。
GC选择,在JDK5.0以后,JVM会根据当前 系统配置进行判断。一般执行-Server命令便可以。gc包括三种策略:串行,并行,并发。
吞吐量大大应用,一般采用并行收集,开启多个线程,加快gc的是否。
响应速度高的应用,一般采用并发收集,比如应用服务器。
年老代建议配置为并发收集器,由于并发收集器不会压缩和整理磁盘碎片,因此建议配置:
    -XX:+UseConcMarkSweepGC  #并发收集年老代
     -XX:CMSInitiatingOccupancyFraction=80 # 表示年老代空间到80%时就开始执行CMS
     -XX:+UseCMSCompactAtFullCollection # 打开对年老代的压缩。可能会影响性能,但是可以消除内存碎片。 
     -XX:CMSFullGCsBeforeCompaction=10 # 由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低。此参数设置运行次

FullGC以后对内存空间进行压缩、整理。
直接运行linux上的jvisualvm
下载X-Manager,可以将试图展现在本地机器上。
不受此jvm支持
保证jvisualvm所属jdk版本和linux上一致。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JVisualVM简介与内存泄漏实战分析 的相关文章

  • 为什么基类的析构函数是虚函数

    点击链接查看更多C 技巧 Effective C 考虑以下继承结构 派生类 Derived 中申请了一块内存 使用指针 i ptr 管理 并在析构的时候释放掉 class Base 基类 class Derived public Base
  • 程序调试

    我高中接触过VB语言 当时主要是用笔抄写书中代码 写过一个计算器 大学主要写 C 程序 工作后需要一些脚本 写过一段时间Python 下面主要是针对C 程序 问题分类 在编程中很容易就会出现各种各样的问题 我觉得初步可以分为下面几种类型 1
  • Net Core 服务器占用内存过高

    高级语言一般都有垃圾回收机制 不用的内存会自己回收掉 当出现占用过高 可能代码不够好 主要还是代码优化 net core这里也有些设置可以不会让服务器崩盘 打开项目文件XXX csproj 在PropertyGroup节点加入
  • 数据湖与数据仓库区别

    数据湖是近两年中比较新的技术在大数据领域中 对于一个真正的数据湖应该是什么样子 现在对数据湖认知还是处在探索的阶段 像现在代表的开源产品有iceberg hudi Delta Lake 那对于数据湖应该是什么样子 先来看数据湖的作者AWS来
  • 如何设计一个数据库

    前言 我们知道 软件工程是为了解决软件危机的 它是采用工程的概念 原理 技术和方法来开发与维护软件 把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来 在软件开发的过程中 数据库设计是非常重要的 它需要根据需求分析设抽
  • 还不知道off-heap堆外内存?安排~

    目录 on heap堆内内存是什么 JVM堆内存是如何划分的 JVM堆内存满了后会怎么样 基于堆外内存解决系统GC卡顿问题 今天给大家聊一个很有意思的知识 就是off heap堆外内存 平时出去面试 或者研究一些技术的时候 经常可能会遇到o
  • 数据仓库之ODS层设计概要

    ODS层辨析 ODS全称是Operational Data Store 即操作数据存储 Inmon VS Kimball Bill Inmon的定义 ODS是一个面向主题的 集成的 可变的 当前的细节数据集合 用于支持企业对于即时性的 操作
  • kaggle(04)---avazu_ctr_predictor(baseline)

    比赛的目的 通过分析网上的系统日志和用户行为信息 来预测某些网页上项目的点击率 是一个二分类的问题 只需要预测出用户是否点击即可 最好能够输出某个概率 比如 用户点击某个广告的概率 比赛官网 文件信息 train Training set
  • Solidity编程开发实例

    Solidity 编程开发实例 Voting 投票 接下来的智能合约教程非常复杂 但展示了很多Solidity的特性 它实现了一个入门的投票合约 当然 电子选举的主要问题是如何赋予投票权给准确的人 并防止操纵 我们不能解决所有的问题 但至少
  • MySQL进阶面试题完全攻略

    除了基础题部分 本文还收集整理的MySQL面试题还包括如下知识点或题型 MySQL高性能索引 SQL语句 MySQL查询优化 MySQL高扩展高可用 MySQL安全性 问题1 char varchar的区别是什么 varchar是变长而ch
  • 数据仓库模型设计V2.0

    一 数仓建模的意义 数据模型就是数据组织和存储方法 它强调从业务 数据存取和使用角度合理存储数据 只有将数据有序的组织和存储起来之后 数据才能得到高性能 低成本 高效率 高质量的使用 高性能 良好的数据模型能够帮助我们快速查询所需要的数据
  • Apache InLong百万亿级数据流处理

    全球最大的开源软件基金会Apache软件基金会正式宣布 Apache InLong成功从Apache孵化器毕业成为社区顶级项目 这个最初由腾讯捐献给Apache社区的一站式海量数据集成框架 可以为大数据开发者提供百万亿级数据流高性能处理能力
  • 学习阿里如何进行数据指标体系的治理

    想必做数据的同学对One Data都有所耳闻 但One Data 体系具体包含了内容 有怎样的应用 不知道大家是否了解 今天我们详细分享一下One Data体系中关于数据治理相关的内容 One Data整体概述 首先 我们看看One Dat
  • C++栈区、堆区、全局静态区、代码区的介绍

    示例代码 include
  • JVM的垃圾回收机制 总结(垃圾收集、回收算法、垃圾回收器)

    如果想了解Java内存模型参考 jvm内存模型 和内存分配以及jdk jre jvm是什么关系 阿里 美团 京东 相信和小编一样的程序猿们在日常工作或面试当中经常会遇到JVM的垃圾回收问题 有没有在夜深人静的时候详细捋一捋JVM垃圾回收机制
  • 什么是ERP、APS和MES

    01 先来说说ERP与MES的区别 ERP 企业资源计划 一天中午 丈夫在外给家里打电话 亲爱的老婆 晚上想带几个同事回家吃饭可以吗 订货意向 丈夫 6个人 我们7点左右回来 准备些酒 烤鸭番茄炒蛋 凉菜 蛋花汤 你看可以吗 商务沟通 妻子
  • 【实战】淘宝电商用户行为分析——SQL

    目录 一 项目背景 1 1分析目的 1 2分析思路 二 数据来源 清洗 2 1数据集介绍 2 2数据清洗 2 2 1 检查是否存在重复值 2 2 2 检查是否存在缺失值 2 2 3 一致化处理 对timestamp 2 2 4异常值处理 时
  • Cassandra 3.0 延迟统计不正确

    我已经设置了新的 Cassandra 3 3 集群 然后 我使用 jvisualvm 通过 MBean jmx 指标 来监控 Cassandra 读 写延迟 所有节点的读 写延迟结果在数周内始终保持稳定而该集群中的读 写请求通常有移动 某天
  • 为什么用Java VisualVM监控Tomcat时堆空间不断增大?

    我有一个在 Tomcat 中运行的 JRubyOnRails 应用程序 浏览到我的应用程序 localhost 登录然后什么都不做后 堆空间似乎在不断增长 这正常吗 如果我按 执行 GC 它会再次下降 我想知道如果我将其保留到其达到计算机
  • 如何使用 VisualVM 查找内存泄漏

    我怀疑我们的 ActiveMQ 连接桥存在重大内存泄漏 我们看到了典型的内存泄漏模式 应用程序加载良好 如果长时间运行或在短时间内一遍又一遍地重新启动 则速度会变慢 我查找了查找 Java 内存泄漏的现代最佳实践 许多开发人员似乎正在放弃

随机推荐