![](/img/trans.png)
[英]Infinite recursion in object/static creation/Why is this code throwing NullPointerException?
[英]Why is infinite object creation not throwing OutOfMemoryError?
为什么我没有使用以下代码获取OutOfMemoryError?
class OutOfMemoryErrorTest{
public static void main(String[] args){
Object obj;
while(true){
obj = new Object();
}
}
}
我正在运行Java 8。
每次循环后,obj将被标记为可收集,因此将被收集。
while(true){
Object obj = new Object(); //no further reference, so obj will be collected
}
如果需要测试OOM,则应将obj的引用保存到LinkedList。
List refs = new LinkedList();
while (true) {
Object obj = new Object();
refs.add(obj);
}
然后你会得到你想要的OOM。 并且您可以使用较小的堆来更快地到达OOM。
因为您没有保存对象引用,所以垃圾收集器删除创建的对象。 如果你将这些对象添加到List,那么它将会发生。
首先,它只是被垃圾收集器删除,因为你在循环中创建它。 其次,你可能有很多记忆,你只需要等待很长时间。 因此,当你修复垃圾收集器时,你可能需要等待很长时间。 试试我在https://crunchify.com/how-to-generate-out-of-memory-oom-in-java-programatically/上找到的代码
package test;
public class OutOfMemoryErrorTest {
/**
* @author Crunchify.com
* @throws Exception
*
*/
public static void main(String[] args) throws Exception {
OutOfMemoryErrorTest memoryTest = new OutOfMemoryErrorTest();
memoryTest.generateOOM();
}
public void generateOOM() throws Exception {
int iteratorValue = 20;
System.out.println("\n=================> OOM test started..\n");
for (int outerIterator = 1; outerIterator < 20; outerIterator++) {
System.out.println("Iteration " + outerIterator + " Free Mem: " + Runtime.getRuntime().freeMemory());
int loop1 = 2;
int[] memoryFillIntVar = new int[iteratorValue];
// feel memoryFillIntVar array in loop..
do {
memoryFillIntVar[loop1] = 0;
loop1--;
} while (loop1 > 0);
iteratorValue = iteratorValue * 5;
System.out.println("\nRequired Memory for next loop: " + iteratorValue);
Thread.sleep(1000);
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.