2011-07-23 20 views
30
  • Java bellek alanları (Perm Space, Space Stack, Heap Space) arasındaki farklar nelerdir?
  • JVM ne zaman birini kullanıyor?
  • Scala/Groovy/etc kullanırsam, farklılıklar var mı?
+3

İlgili geçerli: http://stackoverflow.com/questions/4848669/perm-space-vs-heap-space , http://stackoverflow.com/questions/1279449/what-is-perm-space – Mat

+1

[Yığın uygulama ayrıntısıdır] (http://blogs.msdn.com/b/ericlippert/archive/2009/04/ 27 /-yığını-is-bir-uygulama-detail.aspx). Kullanıcı tanımlı değer türlerinden yoksun olduğu, ancak yine de toplanan bir dilde çalışan herkes için önemli bir okuma olduğu için Java için sadece bu kadar önemli olmayabilir. – delnan

+0

diğer JVM dilleri aynı standardı kullanıyor mu? – caarlos0

cevap

71

Basitçe

  • Öbek uzay: Tüm canlı nesneler burada tahsis edilir.
  • Yığın alanı: Yöntem çağrısında veya değişken örneklemede değişken için nesneye başvurular depolar.
  • Perm alanı: saklar yüklü sınıfları bilgi Örneğin

:

Student std = new Student(); 

bellek durumu üzerinde çizgi çalıştırdıktan sonra böyle olacaktır.

  • Öbek: saklar "Yeni Öğrenci()"
  • Stack: "Std"
  • Perm Uzay hakkında bilgileri depolar: Öğrenci sınıfı hakkında bilgileri depolar
+12

Yığın, ilkel okurları da depolar. –

+0

@Daniel: Bilgi için teşekkürler. Bunu bilmiyordum ve bunun hakkında daha fazla çalışacağım. – Kowser

+0

@Daniel: Yığın ayrıca ilkel okurları da saklar. Ne demek istiyorsun? Yığın, tamamen Yığın konuşmuyor _anything_ Yığın sadece ifadeleri değerlendirirken kullanılan yöntem çağrıları ve "değerler" parametreleridir. –

2

bir cevap eklemek için beni affedin Böyle eski bir soru - Geçerli cevap harika, ancak statik kod ve Java 8 güncellemeleri nedeniyle birkaç kenar durumu özlüyor.

Bakış

    • Konu başına bu bellek kapsama aldığı
    • Mağazaları yerel referanslar ve ilkeller Ayrılan Stack - When in bir yöntemi veya diş uçları, bütün bunların veri stack is
    • En hızlı erişime sahiptir, bu nedenle yerel bir ilkel daha hızlıdır se yerel Nesne daha
  • Öbek
    • Tüm tahsis nesne örneklerini genç nesil ilk etapta GC olmak üzere Generations ayrılır
    • ayırmaları yüzden tüm dişlerine
    • Mevcut görünüyor burada mevcut ve ayrılmalar eşitlenmelidir
    • Bu bellek parçalanmış olabilir (, ancak bunu genelde kendiniz yönetmiyorsunuz)
  • PermGen
    • Mağazaları yüklenen sınıf bilgisi değişmez bilgileri (Primatives, Dizeleri enterne
    • Mağazaları)
    • Mağazaları statik sınıf members

Örnek Kod

public class SimpleVal { //The Class (loaded by a classloader) is in the PermGen 

    private static final int MAGIC_CONSTANT = 42; //Static fields are stored in PermGen 
    private static final SimpleVal INSTANCE = new SimpleVal(1); //Static field objects are created in the heap normally, with the reference in the PermGen ('class statics' moved to the heap from Java 7+) 
    private static SimpleVal previousInstance; //Mutable static fields also have their reference in PermGen so they can easily cause memory leaks 

    private int value; //Member variables will be part of the heap 

    public SimpleVal(int realValue) { 
     value = realValue; 
     ... 
    } 

    public static int subtract(SimpleVal val1, SimpleVal val2) { 
     .... 
    } 

    public int add(SimpleVal other) { //Only one copy of any method (static or not) exists - in PermGen 
     int sum = value + other.value; //Local values in methods are placed in the Stack memory 
     return sum; 
    } 

} 

public static void main(String[] args) { 

    SimpleVal val1 = null; 
    SimpleVal val2 = new SimpleVal(3); //Both of these variables (references) are stored in the Stack 

    val1 = new SimpleVal(14); //The actual objects we create and add to the variables are placed in the Heap (app global memory, initially in the Young Gen space and later moved to old generation, unless they are very large they can immediately go old gen) 

    int prim = val1.add(val2); //primitive value is stored directly in the Stack memory 
    Integer boxed = new Integer(prim); //but the boxed object will be in the heap (with a reference (variable) in the Stack) 

    String message = "The output is: "; //In Java 7+ the string is created in the heap, in 6 and below it is created in the PermGen 
    System.out.println(message + prim); 

} 

Java 8 Not: PermGen uzay Metaspace ne denir ile değiştirildi. Bu işlem yine aynı şekilde çalışır ancak otomatik olarak yeniden boyutlandırılabilir - varsayılan olarak Metaspace auto, yerel belleğe boyutunu (JVM paramlarında belirtilir) maksimuma çıkarır, ancak PermGen her zaman yığın belleğine bitişik sabit bir maksimum boyuta sahiptir.

Android Not: Android 4.0'dan itibaren (uygulamada 3.0) Android açıklanan bellek sözleşmelerini onurlandırmalıdır - ancak daha eski sürümlerde implementation was broken. Android-Davlik'teki 'Stack' hafızası aslında kayıt temellidir (talimat boyutları ve sayımlar ikisi arasında farklılık gösterir, ancak bir geliştirici için işlevsellik aynı kalır).

Son olarak, daha fazla bilgi için şimdiye kadar StackOverflow'daki bu konuya gördüğüm en iyi cevap here

İlgili konular