内存泄漏分析

2022-12-03 12:16:49 浏览数 (1)

在内存映像文件导出中详细的介绍了当应用程序出现内存泄露的时候自动导出内存映像文件。在实际的生产环境中主要是使用jamp通过命令行的模式来导出内存镜像文件,下面详细的阐述下这个过程。

代码语言:javascript复制
jps -l
#通过jps命令来获取PID的信息
23207 com.example.dbplus.DbPlusApplication

#下面使用jamp导出内存镜像文件到桌面
 jmap -dump:format=b,file=/Desktop/heap.hprof  23207
Dumping heap to /Desktop/heap.hprof ...
Heap dump file created

如上所示导出文件成功,在桌面就可以找到heap.hprof的文件。

不管是IDEA在内存泄漏的时候内存映像文件自动导出还是使用jamp命令导出内存映像文件,目的都是想通过查看hprof文件来分析内存泄漏的根本原因,查看hprof文件可以使用MAT的工具,也可以使用JVisualVM的工具。这里主要演示使用MAT的工具来查看hprof的文件。

打开MAT的工具后,在File中点击Open heap dump按钮,打开桌面的hprof的文件,具体如下图所示。

点击Finish按钮后,就会显示如下图的信息。

首先来查看对象的数量信息,具体显示如下图所示。

应用程序的内存泄露主要是有太多的Person对象没有释放从而导致内存泄露,搜索Person后显示如下所示。

如上能够看到Person对象占用了大概39M的内存资源,下面查看Person对象被引用的过程以及GC Roots,具体操作如下所示。

查看后如下展示的是Person被引用以及详细的GC Roots信息,具体如下所示。

再来查看对象堆的信息,可以看到占用的比例达到了71.26%,具体如下所显示。

结合上面的信息以及下面的信息,就可以知道是MemoryController导致了内存泄漏,具体如下所示。

在实际测试的工作中,针对IO密集型的程序需要额外的注意,因为这样的程序它会消耗内存资源,那么如果被测试的应用程序可能就会存在堆内存泄漏或者是非堆内存泄漏的情况,具体还是需要结合具体的业务场景以及模拟大量的并发请求,让程序一直处于繁忙中从而来验证和测试是否会出现内存泄漏,如果出现内存泄漏的情况下使用jamp命令导出hprof文件来使用MAT来进行分析内存泄漏的原因,或者是可以把内存映像文件反馈给开发一起来协助定位,不断的进行调整参数从而让程序达到即使在客户端高并发的请求下,服务依然能够有序的处理客户端的请求并且保障服务端本身的稳定性。

性能测试是每个测试工程师都必须需要掌握的测试技术栈之一,特别是在现在被测试的应用程序基本都需要进行负载以及压力测试,和稳定性的测试来验证程序的响应时间和它的吞吐量,通过这些验证的方式来保障底层服务的稳定性和高可用。

0 人点赞