一、创建内存泄露案例
package com.mxl.controller;import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;@RestController
@RequestMapping(value = "/demo")
@Slf4j
public class DemoController {private static List<Object> list = new LinkedList<>();@GetMapping("/leak")public String leak(){for (int index =0;index<1000; index++){UserInfo userInfo = new UserInfo();list.add(userInfo);}return "success";}@Dataclass UserInfo{private String username;}
}
二、排查流程
动态监控内存
# 每隔3秒执行一次
vmstat 3
排查发现出现内容泄露
排查jvm内存分配情况(内存分配合理)
jmap -heap 进程id
排查是否存在异常未清除类
jmap -histo:live <pid>|sort -k 2 -g -r|less
排查回收对象情况
jmap -finalizerinfo 进程id
下载堆内存
jmap -dump:live,format=b,file=myjmapfile.hprof 进程id
堆分析工具
虚拟机堆转储快照分析工具
使用jdk的 jvisualvm工具(建议采用):
- 打开命令行或终端窗口。
- 输入
jvisualvm 并按 Enter 键启动
- 在 jvisualvm 中,选择 "File" -> "Load...",然后选择要打开的 HPROF 文件。
- 点击 "Open" 或 "OK" 来加载并分析 HPROF 文件。