2010-02-14 16 views
7

Estaba tratando de estudiar diferentes excepciones en Java y encontré el OutOfMemoryError y quería verlo en el trabajo, así que escribí el siguiente programa para crear objetos infinitos creándolos en un bucle infinito. El programa no ir en bucle infinito que no lanza la excepción OutOfMemoryError :(Java OutOfMemoryError doubt

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

¿Qué me falta?

Respuesta

12

Está en el camino correcto. Lo único que se echa en falta es el concepto de basura . el programa hace colección de hecho crear objetos Integer infinitas pero después de la primera iteración, el objeto creado en la iteración anterior se convierte en elegible para GC

considere esto:.

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. 

Si desea ver OutOfMemoryError, debe asegurarse de que hay una forma de llegar a los objetos creados en el bucle infinito. Así que usted puede hacer algo como:

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. 
    } 
} 
} 

En este programa objetos Integer se crean infinitamente como antes, pero ahora los añadir a un vector de modo a asegurar que hay una manera de llegar a ellos y no ser elegible GC .

+4

+1 pero yo usaría una lista porque Vector es old-hat (sychronised/not a Collection etc.) –

+1

@Brian ¿podría explicarlo? Vector es una lista y una colección. –

+0

Lo siento, mi error re. el negocio de Colección/Lista. Las operaciones de Vector están todas sincronizadas. Consulte http://stackoverflow.com/questions/1792134/a-colleague-said-dont-use-java-util-vector-anymore-why-not –

3

La variable de i es recolección antes de llegar a la OutOfMemoryError, ya que no se usa más.

1

La variable i solo tiene alcance al ciclo, no sobrepasa cada iteración. Por lo tanto, se está recolectando basura antes de que el programa se quede sin memoria. Trate de crear un ArrayList antes de entrar en el bucle y la adición de cada instancia de i a ella:

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

omitiendo el argumento para el constructor Integer. –

0

intento con algo así como un

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

2

La forma más fácil de obtener una OutOfMemoryException es crear una matriz que no cabe en la 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]; 
    } 
} 
Cuestiones relacionadas