2016-02-09 4 views
0

Я придумал следующий метод. Я получаю ошибку stackoverflow. Есть ли более быстрый способ?Самый быстрый способ исчерпать память

static void looper(){ 
     long a = 0; 
     a++; 
     System.out.println(a); 
     looper(); 
    } 
+1

'static void loper() {loper();}'? Зачем? – Bathsheba

+1

Если вы хотите получить 'StackOverflowError', тогда просто вызовите' looper' в качестве первого оператора. Не нужно создавать, увеличивать и печатать 'a'. – Tom

+2

Если вы просто хотите исчерпать память, почему бы просто не выделить массив _massive_? – ajshort

ответ

1

быстрый способ получить OutOfMemoryError является:

final int[] memoryGrave = new int[Integer.MAX_VALUE]; 

Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit

(Вы можете более найти о максимальных размерах массивов в этом вопросе: Do Java arrays have a maximum size?)

Но это возможно, не будет тем, что вы ищете, поскольку возможно, что JVM проверяет запрос ed размер массива и выбрасывает эту ошибку до Фактически заканчивается память.
Но вы можете изменить этот код немного, чтобы сделать это «правильно»:

final List<int[]> memoryGrave = new ArrayList<>(); 
while(true) { 
    memoryGrave.add(new int[Integer.MAX_VALUE - 5]); 
} 

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

Но если это «быстрый способ» получить эту ошибку (и на самом деле запустить из памяти) все еще можно обсудить.


Когда вы заключаете код выше в try/finally, то вы можете измерить время, необходимое, чтобы бросить эту ошибку:

long start = System.currentTimeMillis(); 
try { 
    final List<int[]> memoryGrave = new ArrayList<>(); 
    while (true) { 
     memoryGrave.add(new int[Integer.MAX_VALUE - 5]); 
    } 
} finally { 
    System.out.println(System.currentTimeMillis() - start); 
} 

На моей машине она должна окрестными 30 мс.

Смежные вопросы