目录
内存飙高如果发生在java进程上,一般情况是因为创建了大量对象导致,持续飙高说明垃圾回收跟不上对象创建的速度,或者内存泄漏导致对象无法被回收!
排查中涉及到如下命令:
jstat -gc pid 1000 查看gc情况,时间等信息,每隔一秒打印一次
jmap -histo pid | head -20 查看堆内存占用空间最大的钱20个对象类型
jmap -dump:live,format=b,file=/home/chenjian/myheapdump.hprof pid 导出堆内存快照
如果每次gc次数频繁,而且每次回收的内存空间也正常,那说明是因为对象创建速度快导致内存一直占用很高;如果每次垃圾回收的内存非常小,那么很可能是因为内存泄漏导致内存一直无法被回收 !
建一个简单的springboot程序,打成jar包,运行:
java -Xmx100m -jar JVMDemo-0.0.1-SNAPSHOT.jar
package com.cjian.jvmdemo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.sql.Array;
import java.util.ArrayList;
import java.util.List;
/**
* @Author: cjian
* @Date: 2024/2/29 17:27
* @Des:
*/
@RestController
public class TestController {
static List<User> userList = new ArrayList<>();
@GetMapping("/test")
public String test() {
for (int i = 0; i < 30; i++) {
userList.add(new User());
}
return "success";
}
static class User {
byte[] b = new byte[1024 * 1024];
}
}
访问test接口几次后就出现访问失败: