一.内存溢出实例
应用日志报:java.lang.OutOfMemoryError: Java heap space
这个现象就是堆溢出,具体原因需要看dump内存。
如果之前配置了:
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath
则会在相应路径下会生成dump文件
生成的文件以:hprf结尾。
用eclipse mat分析:
可以看到main线程中,有个map占用了98.75%的内存。
可以继续看 [see stacktrace],显示如下:
Thread Stack
main
at java.lang.OutOfMemoryError.<init>()V (OutOfMemoryError.java:48)
at java.lang.Integer.valueOf(I)Ljava/lang/Integer; (Integer.java:642)
at jvm.OverHeapTest.main([Ljava/lang/String;)V (OverHeapTest.java:13)
找到OverHeapTest对应13行代码:
public class OverHeapTest {
public static void main(String[] args) {
Map<Object,String> map = new HashMap<Object, String>();
Random r = new Random();
while (true) {
map.put(r.nextInt(), "value");
}
}
}
可以看到有个while循环不断往map塞元素。