2011-07-23 9 views
30
  • Javaメモリ空間(Perm Space、Space Stack、Heap Space)の違いは何ですか?
  • JVMはいつ別のものを使用しますか?
  • Scala/Groovy/etcを使用している場合、違いはありますか?
+3

関連です:http://stackoverflow.com/questions/4848669/perm-space-vs-heap-space 、http://stackoverflow.com/questions/1279449/what-is-perm-space – Mat

+1

[スタックは実装の詳細です](http://blogs.msdn.com/b/ericlippert/archive/2009/04/ 27/the-stack-is-an-implementation-detail.aspx)。 Javaにはユーザー定義の値型がないため重要ではないかもしれませんが、ガベージコレクション言語で作業するすべての人にとっては重要な読書です。 – delnan

+0

他のJVM言語も同じ標準を使用していますか? – caarlos0

答えて

71

単に

  • ヒープ・スペース:すべてのライブオブジェクトは、ここで割り当てられています。
  • スタックスペース:メソッド呼び出しまたは変数のインスタンス化で変数のオブジェクトへの参照を格納します。
  • パーマスペース:店舗ロードされたクラス情報たとえば、

は:

Student std = new Student(); 

メモリ状態上記の行を実行した後、このようになります。

  • ヒープ:店舗 "新しい学生()"
  • スタック:パーマスペース
  • "STD" に関する情報を格納する:Studentクラスに関する情報が格納され
+12

スタックにはプリミティブリテラルも格納されます。 –

+0

@ダニエル:情報ありがとう。私はそれを知らなかったので、私はそれについてもっと勉強します。 – Kowser

+0

@Daniel:Stackにはプリミティブリテラルも格納されます。それはどういう意味なの?厳密に言えばスタックは保存されません_スタックにはメソッド呼び出しのパラメータと式の評価に使用される "値"のみがあります。 –

2

はに答えを追加するために私を許してそのような古い質問 - 現在の答えは素晴らしいですが、静的コードとJava 8のアップデートのためにいくつかのケースが欠けています。スレッドごとに割り当てられる

概要

  • スタック
    • 店舗のローカル参照とプリミティブ
    • これは、スコープ・メモリーである - メソッドまたはスレッドが終了すると、中にすべてのデータスタックが失われています
    • アクセスが最も速いため、ローカルプリミティブは高速ですSEはローカルオブジェクトより
  • ヒープは
    • は、すべての割り当てられたオブジェクトのインスタンスは、最年少の世代は、最初の場所のGCであることで、世代に分かれ
    • が割り当てので、すべてのスレッドへ
    • 利用可能になりますここに存在して割り当てを解除する必要があります
    • このメモリは断片化する可能性がありますが()、通常はこれを自分で管理しません。
  • PermGen
    • ストアロードしたクラス情報
    • 格納不変情報(Primatives、
    • ストア静的クラスmembers

例コード)文字列のインターン

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注: PermGenスペースがメタスペースと呼ばれているものと交換しました。これは同じように機能しますが、自動的にリサイズすることができます。デフォルトでは、Metaspace autoはネイティブメモリーのサイズを最大(JVM paramsで指定)まで増やしますが、PermGenは常にヒープメモリーに隣接する固定最大サイズを持ちます。

Androidノート: Android 4.0から(実際には3.0から)Androidは記述されたメモリ契約を守らなければなりませんが、古いバージョンのimplementation was brokenではAndroidが対応する必要があります。 Android-Davlikの 'Stack'メモリは実際にはレジスタベースです(命令サイズと数は2つで異なりますが、開発者にとっては機能は同じです)。

最後に、より多くの情報のために私が今までStackOverflowの上で、この主題に見た中で最高の答えはhere