public class HeapOOMTest { private List<String> oomList = new ArrayList<>(); public static void main(String[] args) { HeapOOMTest oomTest = new HeapOOMTest(); while (true) { oomTest.oomList.add(UUID.randomUUID().toString()); } } }
VM Args:-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
运行该代码的Main方法
java.lang.OutOfMemoryError: Java heap space Dumping heap to java_pid18940.hprof ... Heap dump file created [23854536 bytes in 0.061 secs] Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.base/java.lang.Long.fastUUID(Long.java:441) at java.base/java.lang.System$2.fastUUID(System.java:2136) at java.base/java.util.UUID.toString(UUID.java:395) at com.imooc.jvminaction.HeapOOMTest.main(HeapOOMTest.java:16)
在项目的根目录会自动创建 java_pid18940.hprof 的文件
Mac系统:mat.app
Win系统:Eclipse Memory Analyzer
Leak Suspects » Leaks » Problem Suspect 1 » Description » See stacktrace 也是可以看出问题的
jvisualvm.exe 分析堆内存溢出
借助工具定位问题
-Xms -Xmx 分配不合理
1.通过控制pageSize判断
if (pageSize > 100) { pageSize = 100; }
2.SpringMVC方式
类头加注解
@Validated
pageSize的入参加注解
@Max(100)