JVM调优工具Jprofiler内存泄漏定位的简单分析(附源码)(二)

导读:本篇文章讲解 JVM调优工具Jprofiler内存泄漏定位的简单分析(附源码)(二),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

问题背景

上个篇章介绍了Jprofiler工具的安装,这个篇章介绍使用Jprofiler内存泄漏定位的简单分析
注意事项:

JVM调优工具Jprofiler无介绍快速安装(附安装包)(一)

内存泄漏用例创建

1 引入pom依赖包

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.7</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.yg</groupId>
    <artifactId>heap-test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>heap-test</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

2 内存泄漏代码

package service;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author suolong
 * @Date 2022/5/13 17:23
 * @Version 2.0
 */
public class HeapOOMService {

    public static void main(String[] args) throws IOException {
        System.in.read();     //启动后会暂停在这里,随便输入字符会执行下面的代码
        List<HeapOOMService> heapOOMServiceList = new ArrayList<>();
        while(true){
            heapOOMServiceList.add(new HeapOOMService());  //内存泄漏测试
        }
    }
}

3 当然这样确实可以造成内存泄漏,但IDEA默认的内存分配有1G了,会等很久,所以需要更改内存的值,并且打印GC,编辑配置
JVM调优工具Jprofiler内存泄漏定位的简单分析(附源码)(二)
4 很多人可能没有VM选项,所以需要选择Modify options进行添加
JVM调优工具Jprofiler内存泄漏定位的简单分析(附源码)(二)
选择Add VM options
JVM调优工具Jprofiler内存泄漏定位的简单分析(附源码)(二)
5 添加内存配置

-Xms5m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\code\csdn\heapTest\a.dump -XX:+PrintGCDetails

解释指令的意思

-Xms5m              #最小分配内存,启动时
-Xmx20m             #最大分配内存
-XX:+HeapDumpOnOutOfMemoryError          #添加内存溢出错误
-XX:HeapDumpPath=D:\code\csdn\heapTest\a.dump         #添加内存溢出时,GC日志的存储位置
-XX:+PrintGCDetails              #开启GC日志打印

6 点击确认
JVM调优工具Jprofiler内存泄漏定位的简单分析(附源码)(二)
7 开始运行main函数
JVM调优工具Jprofiler内存泄漏定位的简单分析(附源码)(二)
8 在Run对话框输入start
JVM调优工具Jprofiler内存泄漏定位的简单分析(附源码)(二)
9 直到出现内存溢出,程序结束
JVM调优工具Jprofiler内存泄漏定位的简单分析(附源码)(二)
10 查看GC日志生成的文件
JVM调优工具Jprofiler内存泄漏定位的简单分析(附源码)(二)
11 把文件改名为Jprofiler可以识别的格式,a.hprof
JVM调优工具Jprofiler内存泄漏定位的简单分析(附源码)(二)
12 使用Jprofiler打开
JVM调优工具Jprofiler内存泄漏定位的简单分析(附源码)(二)
13 可以看到第一条是最大的对象,这个是内存泄漏的地方,右键Use Selected Objects点进去
JVM调优工具Jprofiler内存泄漏定位的简单分析(附源码)(二)
14 选择默认references
JVM调优工具Jprofiler内存泄漏定位的简单分析(附源码)(二)
15 可以看到这个集合里面装的所有对象
JVM调优工具Jprofiler内存泄漏定位的简单分析(附源码)(二)
16 右键Show In Graph点进去
JVM调优工具Jprofiler内存泄漏定位的简单分析(附源码)(二)
17 可以可视化看到内存泄漏的一个追溯,什么类型的集合,哪一个方法出现的内存泄漏
JVM调优工具Jprofiler内存泄漏定位的简单分析(附源码)(二)

总结

  • 其实出现内存泄漏的时候,JVM也会抛出异常,定位到具体HeapOOMService类中main方法第18行出现了内存泄漏,工具只是让我们更方便分析

JVM调优工具Jprofiler内存泄漏定位的简单分析(附源码)(二)

作为程序员第 133 篇文章,每次写一句歌词记录一下,看看人生有几首歌的时间,wahahaha …
JVM调优工具Jprofiler内存泄漏定位的简单分析(附源码)(二)JVM调优工具Jprofiler内存泄漏定位的简单分析(附源码)(二)JVM调优工具Jprofiler内存泄漏定位的简单分析(附源码)(二)

Lyric: 让我不再想念你

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/110742.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!