- 使用springboot 创建一个会出现 内存溢出的接口
@RestController
public class JvmThreadController {
List<byte[]> memoryList = new ArrayList<>();
@GetMapping("/memoryTest")
public String memoryTest(int c) {
byte[] b = new byte[c * 1024 * 1024];
memoryList.add(b);
return "success";
}
}
出现的异常报错:
java.lang.OutOfMemoryError: Java heap space
- 启动java 进程
- 下载arthas jar 包
- 启动:
java -jar arthas-boot.jar --repo-mirror aliyun --use-http
启动后会自动检测运行中的java 进程,输入要检测的进程编号1(这里选择第一个)
输入dashboard
使用arthas生成内存分区的火焰图:
- 输入:
profiler start --event alloc
- 等待一会,获取已采集的sample的数量:
profiler getSamples
- 等待一会停止采集,并生成html文件,后面时文件存放的地址:
profiler stop --format html --file /home/output.html
- 将output.html文件从生产环境导出到本地,用浏览器打开:
##使用 heapdump将此时的hprof快照文件导出
heapdump /home/heapdump.hprof
- 使用软件打开:
可以看到占用内存最多的代码