2010-02-14 17 views
7

Stavo cercando di studiare diverse eccezioni in Java e ho trovato OutOfMemoryError e volevo vederlo in lavoro, così ho scritto il seguente programma per creare oggetti infiniti creando in un loop infinito. Il programma non va in loop infinito che non genera l'eccezione OutOfMemoryError :(Java OutOfMemoryError dubbio

class Test { 
    public static void main(String...args) { 
     while(true) { 
      Integer i = new Integer(); 
     } 
    } 
} 

Che cosa mi manca?

risposta

12

Siete sulla strada giusta. L'unica cosa che manca è il concetto di immondizia . collezione il programma fa infatti creare oggetti Integer infiniti ma dopo il 1 ° iterazione, l'oggetto creato nella precedente iterazione diventa idoneo per GC

Considerate questo:.

Integer i;  
i = new Integer(); // 1. create new object and make reference variable i refer to it. 
i = new Integer(); // 2. create another object and make reference variable i refer to it...there is no way to get to the object created in step1 so obj in step 1 is eligible for GC. 

Se si desidera visualizzare l'errore OutOfMemoryError è necessario assicurarsi in qualche modo che vi sia un modo per raggiungere gli oggetti creati nel ciclo infinito. Così si può fare qualcosa di simile:

class Test { 
public static void main(String...args) { 
    Vector v = new Vector(); // create a new vector. 
    while(true) { 
    v.addElement(new Integer(1)); // create a new Integer and add it to vector. 
    } 
} 
} 

In questo programma gli oggetti interi sono creati infinitamente come prima, ma ora li ho aggiungere un vettore in modo da assicurarsi che ci sia un modo per arrivare a loro e non diventano GC ammissibili .

+4

+1 ma io userei una lista poiché Vector è old-hat (sicronizzato/non una raccolta ecc.) –

+1

@ Brian potresti elaborare? Il vettore è una lista e una collezione. –

+0

Mi dispiace, il mio errore è re. il business Raccolta/Elenco. Le operazioni di Vector sono tutte sincronizzate. Vedi http://stackoverflow.com/questions/1792134/a-colleague-said-dont-use-java-util-vector-anymore-why-not –

3

La variabile i è garbage collection prima di colpire il OutOfMemoryError, dato che non è più utilizzato.

1

La variabile i è limitata al ciclo, non sopravvive oltre ogni iterazione. In questo modo è possibile raccogliere i dati prima che il programma possa esaurire la memoria. Prova a creare un ArrayList prima di entrare nel ciclo e l'aggiunta di ogni istanza di i ad esso:

public class Test { 

    public static void main(String[] args) { 
     List<Integer> list = new ArrayList<Integer>(); 
     while (true) { 
      Integer i = new Integer(); 
      list.add(i); 
     } 

    } 

} 
+1

manca l'argomento per il costruttore Integer. –

0

prova con qualcosa di simile a un

List l = new ArrayList(); int i = 0; while(true) { l.add(i++); }

2

Il modo più semplice per ottenere un OutOfMemoryException è quello di creare un array che non va bene in memoria:

 
public class TestOutOfMemoryException 
{ 
    public static void main(String[] args) 
    { 
     final long maxMemory = Runtime.getRuntime().maxMemory(); 
     System.out.println(maxMemory); 
     final byte[] boom = new byte[(int) maxMemory]; 
    } 
} 
Problemi correlati