现象java
有一个方法 逻辑以下oop
发现当数据量大的时候 若有几万条数据待处理 很容易发生内存溢出的问题 以为很奇怪 不是每次限制只查500条吗 怎么还会有内存溢出的问题呢?spa
假设
递归调用不会释放局部变量 直到方法调用结束code
证实递归
@Test public void recursiveCall(){ foo(1); } private void foo(int i){ // 局部变量 占用1M byte[] a = new byte[1 * 1024 * 1024]; System.out.println(i+" "+a.length); foo(i+1); }
当指定最大堆内存50M (-Xmx50M
)的时候 递归调用到40次左右的时候 便会发生内存溢出异常内存
40 1048576 java.lang.OutOfMemoryError: Java heap space
可知递归调用并未释放变量a的内存占用变量
解决
改为循环调用便可循环
@Test public void loopCall(){ bar(); } private void bar(){ int index = 1; while (true) { byte[] a = new byte[1 * 1024 * 1024]; System.out.println(index+" "+a.length); index ++; } }
一样设置-Xmx50M
此时能够无限执行下去方法