一、代码 1、TestApplication.java本案例,是由ThreadLocal引起的内存泄露,最终导致内存溢出
模拟堆内存溢出:
-Xms1000M -Xmx1000M
堆内存溢出时自动导出堆文件:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=jvm.hprof
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 启动前请设置参数:
* -Xms1000M -Xmx1000M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=jvm.hprof
*/
@SpringBootApplication
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
}
2、TLController.java
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@RestController
public class TLController {
@RequestMapping(value = "/tl")
public String tl(HttpServletRequest request) {
ThreadLocal<Byte[]> tl = new ThreadLocal<Byte[]>();
// 1MB
tl.set(new Byte[1024 * 1024]);
return "ok";
}
}
二、启动
1、 idea启动
2、 jar启动模拟堆内存溢出:
-Xms1000M -Xmx1000M
堆内存溢出时自动导出堆文件:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=jvm.hprof
java -jar -Xms1000M -Xmx1000M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=jvm.hprof jvm-case-0.0.1-SNAPSHOT.jar
三、正常访问
http://127.0.0.1:8080/tl
语法 :
jstack PID 查看线程情况,发现没有死锁或者IO阻塞的情况
示例:
jstack 50700
3、jmap分析
语法:
jmap -heap PID 查看堆内存的使用
示例:
java -heap 50700 发现堆内存的使用率已经高达99.93%
语法:
jmap -histo:live PID | more 查询哪个实例对象占用内存最多
示例:
jmap -histo:live 50700 | more
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)