2010-02-14 20 views
7

Java'da farklı istisnalar araştırmaya çalıştım ve OutOfMemoryError'a rastladım ve işte görmek istedim, böylece sonsuz bir döngü içinde oluşturarak sonsuz nesneleri oluşturmak için şu programı yazdım. Program OutOfMemoryError istisna :(Java OutOfMemoryError şüphe

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

ben eksik ne atmaz sonsuz döngüye gider?

cevap

12

Doğru yoldayız. Eğer eksik olan tek şey çöp kavramdır . tahsilat programı yapar infact sonsuz Tamsayı nesneleri oluşturmak ancak 1 tekrarlanmasından sonra önceki yineleme oluşturulan nesne GC için uygun hale gelir

bu düşünün:.

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. 

OutOfMemoryError'ı görmek istiyorsanız, bir şekilde sonsuz döngüde oluşturulan nesnelere ulaşmanın bir yolu olduğundan emin olmalısınız. Tamsayı nesneleri sonsuz önceki gibi oluşturulur Bu programda

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

ama şimdi bu yüzden onlara almanın bir yolu olduğundan emin olun bir vektör ekleyebilir ve onlar GC uygun olmazlar: Yani böyle bir şey yapabilirsiniz .

+4

+1 Ama bir Listeyi kullanıyorum çünkü Vector eski şapkalı (senkronize/Koleksiyon değil vb.) –

+1

@Brian ayrıntılı bilgi verebilir miydi? Vektör bir Liste ve bir Koleksiyon. –

+0

Üzgünüm - benim hatam Koleksiyon/Liste iş. Vektörün işlemleri senkronize edilir. Tamsayı kurucu için argümanı eksik olan http://stackoverflow.com/questions/1792134/a-colleague-said-dont-use-java-util-vector-anymore-why-not –

3

OutOfMemoryError numaralı ifadeye tıklamadan önce toplanan atık i artık kullanılmıyor.

1

i değişkeni yalnızca döngü için belirlenir, her yineleme işleminden sonra hayatta kalmaz. Böylece programın hafızasından çıkabilmesi için çöp toplanıyor. döngü girme ve buna i her örneğini eklemeden önce bir ArrayList oluşturmayı deneyin: Bir OutOfMemoryException almanın en kolay yolu

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

adresine bakın. –

0

deneyin şey ile bir

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

2

gibi bir dizi oluşturmaktır hangi bellek içine sığmaz:

 
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]; 
    } 
} 
İlgili konular