在测试IO密集型应用程序的时候,当出现内存泄露的时候,往往需要针对这部分进行分析内存泄露的具体原因。常规的一种方式是我们使用JVM的监控工具来监控这部分,来查看堆内存以及非堆内存的实际使用率和过程中应用程序本身的CPU使用率。但是被测试的服务一旦出现内存泄露,该服务就会疯狂的打印内存泄露的日志信息同时客户端请求服务,服务一直处于超时的情况。那么这个时候如JVisualVM的监控也会失去连接,并不能够看到很关键的信息。所以下面详细的阐述下当被测试的服务一旦出现内存泄露的时候,使用自动导出以及命令行导出的方式来获取到内存映像的文件,从而对分析内存泄露提供有利的信息。
内存泄露要么是堆内存泄露要么是非堆内存泄露,很多时候是堆内存泄露导致。这部分主要阐述下当内存泄露的时候,自动导出内存的映像文件,要实现内存泄露自动导出内存映像文件,需要配置的信息具体为:
代码语言:javascript复制-XX: HeapDumpOnOutOfMemoryError
#导出的内存映像文件的路径,这是当前路径
-XX:HeapDumpPath=./
在IDEA中,点击菜单栏Run中的Edit Configurations,具体如下所示。
点击配置后,在VM options中填写如上的配置信息,具体如下所示。
配置成功后启动服务,进行高并发的访问服务,就会出现内存泄露以及同时会自动的显示出导出的内存映像文件,具体输出的信息如下所示。
代码语言:javascript复制java.lang.OutOfMemoryError: Java heap space
Dumping heap to ./java_pid44945.hprof ...
Heap dump file created [47080914 bytes in 0.291 secs]
如上显示内存映像文件已导出,在当前目录下也会看到这部分,具体如下所示。
另外一种方式是使用jamp命令方式的模式来导出内存映像的文件,使用jamp导出内存映像文件的命令如下所示。
代码语言:javascript复制jps -l
#查询到PID信息
45164 com.example.dbplus.DbPlusApplication
#使用jamp导出内存映像文件
jmap -dump:format=b,file=/root/heap.hprof 45164
Dumping heap to /root/heap.hprof ...
Heap dump file created
如上所示,通过jamp命令的模式来导出内存映像文件,后续文章详细地阐述下针对内存映像文件的打开方式以及针对它的分析。