一、创建内存泄露案例
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";
}
@Data
class 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 文件。