JVM内存泄漏分析的demo

news2024/12/22 19:57:45

本文参考:

JVM调优参数、方法、工具以及案例总结

JVM监控和调优常用命令工具总结 - Pickle - 博客园 (cnblogs.com)

面试官问我JVM调优,我忍不住了! - Java3y - 博客园 (cnblogs.com)

从实际案例聊聊Java应用的GC优化 (qq.com)

JVM调优的几种场景(建议收藏) (qq.com)

上面是在学习过程中参考到的各种文献,下面是动手去做一个内存泄漏分析的小demo

场景模拟

  1. 编写一个会有内存泄漏的场景,在下面我是模拟了一个线程池不销毁并且不停创建非核心线程(非核心线程在60s不用就会自动destory)的例子
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @Author jiangxuzhao
 * @Description
 * @Date 2023/9/17
 */
public class MemoryLeak {
    public static void main(String[] args) {
        MemoryLeak memoryLeak = new MemoryLeak();
        while (true) {
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            memoryLeak.run();
        }
    }

    private void run() {
        // 不断创造非核心线程
        ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 0; i < 10; i++) {
            executorService.submit(()->{
//                System.out.println(Thread.currentThread().getName());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            });
        }
    }
}

  1. 命令行操作,编译文件

    javac MemoryLeak.java   
    
  2. 命令行操作,执行文件,并且-Xms1m -Xmx1m表示运行的初始堆大小1m,最大堆大小也是1m,这些参数较小是为了有意构造OOM场景,-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./heap.bin是为了能够dump出OOM日志

    java -Xms1m -Xmx1m -XX:+PrintGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./heap.bin MemoryLeak
    

    注意⚠️:dump文件太大,一下子不能够产生heap.bin文件,需要重试或者耐心等待

  3. 观察输出

    ...
    [Full GC (Ergonomics)  997K->997K(1536K), 0.0150748 secs]
            at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:674)
    [Full GC (Ergonomics)  997K->992K(1536K), 0.0153944 secs]
            at java.lang.StringBuilder.append(StringBuilder.java:214)
            at java.util.concurrent.Executors$DefaultThreadFactory.newThread(Executors.java:613)
            at java.util.concurrent.ThreadPoolExecutor$Worker.<init>(ThreadPoolExecutor.java:619)
    [Full GC (Ergonomics)  997K->992K(1536K), 0.0156156 secs]
            at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:932)
            at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1378)
            at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112)
            at MemoryLeak.run(MemoryLeak.java:26)
            at MemoryLeak.main(MemoryLeak.java:18)
    [Full GC (Ergonomics)  997K->989K(1536K), 0.0149037 secs]
    [Full GC (Ergonomics)  997K->989K(1536K), 0.0146840 secs]
    [Full GC (Ergonomics)  997K->989K(1536K), 0.0138023 secs]
    [Full GC (Ergonomics)  997K->989K(1536K), 0.0146598 secs]
    [Full GC (Ergonomics)  997K->989K(1536K), 0.0140917 secs]
    [Full GC (Ergonomics)  997K->989K(1536K), 0.0141075 secs]
    [Full GC (Ergonomics)  997K->990K(1536K), 0.0138773 secs]
    [Full GC (Ergonomics)  997K->990K(1536K), 0.0137902 secs]
    [Full GC (Ergonomics)  997K->990K(1536K), 0.0134941 secs]
    [Full GC (Ergonomics)  997K->990K(1536K), 0.0139297 secs]
    [Full GC (Ergonomics)  997K->990K(1536K), 0.0138875 secs]
    [Full GC (Ergonomics)  997K->990K(1536K), 0.0136721 secs]
    [Full GC (Ergonomics)  997K->990K(1536K), 0.0135201 secs]
    [Full GC (Ergonomics)  997K->991K(1536K), 0.0138388 secs]
    ...
    [Full GC (Ergonomics)  997K->995K(1536K), 0.0135345 secs]
    [Full GC (Ergonomics)  997K->995K(1536K), 0.0135026 secs]
    [Full GC (Ergonomics)  997K->995K(1536K), 0.0130507 secs]
    [Full GC (Ergonomics)  997K->995K(1536K), 0.0128278 secs]
    [Full GC (Ergonomics)  997K->996K(1536K), 0.0138620 secs]
    [Full GC (Ergonomics)  997K->996K(1536K), 0.0129367 secs]
    

    打印出了Full GC的过程,但是占用的内存还是越来越多,确实发生了内存泄漏,初步猜测就是线程创建后一直没有销毁,线程池也没有shutdown

问题分析

借助MAT分析上面dump下来的heap.bin文件

去官网下载就好 -> https://eclipse.dev/mat/downloads.php

  1. File->Open Heap Dump… 查看刚刚的heap.bin文件

在这里插入图片描述

  1. 选择其中的泄漏报告 Leak Suspects
    在这里插入图片描述

可以看到Problem Suspect 1 2 3列出了几个可能发生内存泄漏的对象,从1和3可以看出,竟然有1435个Thread对象以及144个ThreadPoolExecutor对象,确实占有了大量内存。

结论也可以得出来:

每个ThreadPoolExecutor创建了10个线程,每个线程的在不处理任务后的60s会被回收,线程池此时也会一直存在等待接受新的任务。又由于外部一直在while(true)创建新的线程池,导致这一分钟以内,堆积了大量被创建的线程池以及其创建的线程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1018763.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微分方程应用案例

下表1给出了近两个世纪美国人口统计表&#xff08;单位&#xff1a;百万&#xff09;&#xff0c;建立数学模型并检验&#xff0c;最后用它预报2010年美国的人口。 年 1790 1800 1810 1820 1830 1840 1850 1860 人口 3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 年…

Chromedriver 在 Python 中查看源代码的方法

Python 中可以属性来查看需要爬取的网站的源代码。 对应具体的是&#xff1a;chrome.page_source 需要注意的是首先需要导入包 from selenium.webdriver import Chrome 然后进行初始化&#xff1a;chrome Chrome(serviceService(r"C:\Users\yhu\Downloads\chromedrive…

华为智慧搜索,下一片流量蓝海的“入海口”

几年前开始&#xff0c;TMT业界就发出了一类质疑的声音&#xff1a;移动互联网的各个APP彼此割裂&#xff0c;是在“孤岛炼油”。 大量的应用程序和服务互不打通&#xff0c;形成了严重的数据孤岛&#xff0c;用户只能进行站内搜索&#xff0c;很难穿透APP壁垒&#xff0c;进行…

平衡二叉树的定义,插入操作以及插入新结点后的调整规则(ALV树)

1.定义 平衡二叉树( Balanced Binary Tree&#xff09;&#xff0c;简称平衡树&#xff08;AVL树&#xff09;。 1.特点 树上任一结点的左子树和右子树的高度之差不超过1。 结点的平衡因子左子树高-右子树高。 2.平衡二叉树的判定 平衡二叉树结点的平衡因子的值只可能是-1…

全国职业技能大赛云计算--高职组赛题卷①(容器云)

全国职业技能大赛云计算--高职组赛题卷①&#xff08;容器云&#xff09; 第二场次题目&#xff1a;容器云平台部署与运维任务1 Docker CE及私有仓库安装任务&#xff08;5分&#xff09;任务2 基于容器的web应用系统部署任务&#xff08;15分&#xff09;任务3 基于容器的持续…

Mysql详解Explain索引优化最佳实践

目录 1 Explain工具介绍2 explain 两个变种3 explain中的列3.1 id列3.2 select_type列3.3 table列3.4. type列3.5 possible_keys列3.6 key列3.7 key_len列3.8 ref列3.9 rows列3.10 Extra列 4 索引最佳实践4.1.全值匹配4.2.最左前缀法则4.3.不在索引列上做任何操作&#xff08;计…

使用 Feature Flags 实现数据库灰度迁移的监控与可观测性

作者&#xff1a;观测云与胡博 场景描述 很多企业会遇到数据库升级、或数据库迁移的情况&#xff0c;尤其是在自建数据库服务向云数据库服务、自建机房向云机房、旧数据库向新数据库迁移等场景。 然而&#xff0c;我们需要在整个移植过程中保证其稳定性、避免数据遗失、服务宕…

Windows 安装 chromedriver 和 Python 调试

下载 chromedriver 从官方网站上下载 chromedriver 的版本&#xff0c;这个版本需要和你 Chrome 的版本对应上。 下载的地址为&#xff1a;ChromeDriver - WebDriver for Chrome - Downloads 这个地方&#xff0c;将会打开一个新的浏览器界面&#xff0c;Chrome for Testing …

9参数化重采样时频变换,基于MATLAB平台,程序已调通,可直接替换数据进行分析。

参数化重采样时频变换&#xff0c;基于MATLAB平台&#xff0c;程序已调通&#xff0c;可直接替换数据进行分析。 9matlab参数化重采样时频变换 (xiaohongshu.com)

Debian 12安装Docker

1.更新系统包 #apt update 2.安装依赖包 #apt install apt-transport-https ca-certificates curl gnupg lsb-release 3.添加Docker源 &#xff08;1&#xff09;添加Docker 官方GPG密钥 #curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/s…

OPENCV实现DNN图像分类

使用步骤1 使用步骤2 使用步骤3 使用步骤4 使用步骤5 使用步骤6 完整代码如下: import numpy as np

lv5 嵌入式开发-1 进程的创建和回收

目录 1 进程概念 2 进程内容 3 进程类型 4 进程状态 5 查看进程信息 5.1 相关命令ps top /proc 5.2 相关命令 nice renice 5.3 相关命令job bg fg 6 子进程概念 7 子进程创建 – fork 8 父子进程 9 思考 10 进程结束 – exit/_exit 11 进程的回收 11.1 进程回…

opencv形状目标检测

1.圆形检测 OpenCV图像处理中“找圆技术”的使用-图像处理-双翌视觉OpenCV图像处理中“找圆技术”的使用,图像处理,双翌视觉https://www.shuangyi-tech.com/news_224.htmlopencv 找圆心得&#xff0c;模板匹配比霍夫圆心好用 - 知乎1 相比较霍夫找直线算法&#xff0c; 霍夫找…

RK3568平台开发系列讲解(调试篇)系统运行相关频率设置

🚀返回专栏总目录 文章目录 一、CPU 频率设置二、DDR 频率设置三、NPU 频率设置沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 CPU 默认是 interactive 状态,它会根据 CPU 使用率和目标负载来动态地调整 CPU 频率。为获得更高运行速度或者性能评估,我们需要手动固…

红外成像技术

针对GI S设备红外检测目前未被大众认可的原因&#xff1a; 1 、 目前对GI S带电检测的意义认识不够&#xff0c; 许多单位认为GI S测温发现不了什么&#xff0c; 对其测温仅仅检测接头。 2、 GI S外壳温度异常的原因多种&#xff0c; 出现外壳温度异常大家不会分析&#xff0c;…

stringBuffer.append(analyze);使用这个拼接时候如何在字符串参数字符串参数整数参数字符串数组参数内容之间添加空格

stringBuffer.append(analyze);使用这个拼接时候如何在字符串参数字符串参数整数参数字符串数组参数内容之间添加空格&#xff1f; 在添加参数到 StringBuffer 时&#xff0c;你可以在每次添加参数之后都添加一个空格&#xff0c;如下所示&#xff1a; StringBuffer stringBu…

【Linux入门】---Linux权限管理详解

文章目录 1.shell命令以及运行原理2.linux用户分类su指令切换用户 3.Linux权限管理3.1Linux文件访问者3.2文件类型和访问权限3.3文件权限值的表示方法3.4文件访问权限的相关设置方法chmod指令--权限修改方法①chmod指令--权限修改方法②chown指令chgrp指令umask指令file指令 4.…

按键点亮led灯

原理图: K0这个按键按下时&#xff0c;开发板D1这个灯亮&#xff0c;松开&#xff0c;灯灭 代码如下: #include "stm32f4xx.h" void LED_Init(void) {//1.定义一个GPIO外设的结构体变量 GPIO_InitTypeDef GPIO_InitStructure;//RCC_AHB1PeriphClockCmd(RCC_AHB1Pe…

【自学开发之旅】Flask-前后端联调-异常标准化返回(六)

注册联调&#xff1a; 前端修改&#xff1a; 1.修改请求向后端的url地址 文件&#xff1a;env.development修改成VITE_API_TARGET_URL http://127.0.0.1:9000/v1 登录&#xff1a;token验证 校验forms/user.py from werkzeug.security import check_password_hash# 登录校验…

目标检测前言,RCNN,Fast RCNN,Faster RCNN

一、RCNN&#xff1a; 找到概率最高的目标之后&#xff0c;与其他目标进行IOU交并比计算&#xff0c;若高于一定值&#xff0c;则说明这两张图片预测的是同一个目标&#xff0c;则把概率低的目标删掉 二、Fast RCNN 因为是直接得到特征图之后进行映射&#xff0c;所以不限制输入…