public static void main(String[] args){
List list = new ArrayList();
try{
while(true){
list.add(new OutOfMemory("try"));
}
}catch(Exception e){
System.out.println(e);
}finally {
System.out.println("finally");
OutOfMemory o = new OutOfMemory("finally o");
System.out.println(o.test);
System.out.println(list.size());
System.out.println(o.test);
}
}
执行结果:
finally
finally o
106710
finally o
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3210)
at java.util.Arrays.copyOf(Arrays.java:3181)
at java.util.ArrayList.grow(ArrayList.java:265)
at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:239)
at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:231)
at java.util.ArrayList.add(ArrayList.java:462)
at main.java.com.liqiangx.memory.OutOfMemory.main(OutOfMemory.java:18)
finally一定会执行的。
可以通过下面方法实时获取堆内存。
// 获取MemoryMXBean
MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
// 打印:堆内存使用
logger.info("heapMemoryUsage: {}", memoryMXBean.getHeapMemoryUsage().toString());
// 打印:非堆内存使用
logger.info("nonHeapMemoryUsage: {}", memoryMXBean.getNonHeapMemoryUsage().toString());
list 超出限定长度了而已,并不是说内存真的一点不剩了
你可以在finally里再多写几个new试试。