Javaの中のメモリの割り当てを議論します。

5819 ワード

---------------------------------------------
Javaメモリ割り当ては主に以下のいくつかの領域を含みます。
1.レジスタ:プログラムでは制御できません。
2.スタック:基本タイプのデータとオブジェクトの参照を保存しますが、オブジェクト自体はスタックに保存されず、スタックに保存されます。
3.ヒープ:newで発生したデータを保管する
4.静的ドメイン:オブジェクトに格納するスタティックメンバー
5.常量池:常量保存
6.非RAM(ランダムアクセスメモリ)記憶:ハードディスクなどの永久記憶空間
 ------------------------------------------------------------------------------------
一.レジスター:
     これは、レジスタがプロセッサ内部にあるため、他の記憶媒体とは異なる速度の記憶場所である。でも、レジスターの個数は限られています。
    メモリ内のレジスタ領域は必要に応じてコンパイラによって割り当てられます。私達のプログラム開発者はコードでこのレジスターの割り当てを制御できません。
    したがって、この最初の記憶領域レジスタは、それらに対して何の影響も与えずに見ることができるだけである。プログラムの中にレジスターの存在感を感じられないです。
    JVMは最も一般的なレジスタを4つだけ設置しました。pcプログラムカウンタoptop操作数スタックトップポインタframeは、現在実行されている環境ポインタvarsが、現在実行されている環境の中で最初のローカル変数のポインタすべてのレジスタに32ビットを指します。pcは、プログラムの実行を記録するために使用されます。optop、frameおよびvarsは、Javaスタックエリアに向けられたポインタを記録するために使用される。
 
二.スタック(Stck):
 スタックともいいます
   一般的なRAMの中にあります。プロセッサは、ポインタを介して直接サポートを提供する。
   プログラムが新しいメモリをセットすると、スタックポインタが後ろに移動します。メモリをリリースすると、ポインタが前に移動します。
   この方式は速いだけでなく、効率も高く、レジスターに次ぐスピードです。
   オブジェクト参照および基本的なデータタイプオブジェクトを格納するためには、Javaオブジェクト自体を格納するためには使用できません。
三.ヒープ(Heap):   一般的なメモリ空間は、Javaオブジェクトを保存するために使用されます。
   Heapはstackと違って、コンパイラはheapからどれぐらいの空間を配置するかを知る必要がありません。heapから配置された空間がどれぐらいあるかを知る必要がありますか?
   従って,自己heap構成記憶空間から高い弾性が得られる。オブジェクトが必要なときは、プログラムにnewを使うだけで、実行時はheapからスペースを設定します。
   もちろん、あなたはこのような弾力性のために代価を払わなければなりません。heapから空間を配置して、stackから構成して、かかった時間は多くなりました。
 
 単理論メモリ空間におけるスタックとスタック:
   1.スタックとヒープはいずれもJavaがRamにデータを保存するところです。Java自動管理スタックとスタックは、プログラマが直接にスタックまたはスタックを設置することができません。
   2.長所と短所:
      スタック:
スタックの利点は、アクセス速度がヒープよりも速く、CPUに直接位置するレジスターに次ぎます。
しかし、スタック中のデータサイズと生存期間は決定されなければならず、柔軟性がないという欠点がある。また、スタックデータは、複数のスレッドまたは複数のスタックの間で共有できないが、スタック内の複数の値が等しい変数は、アドレスを指すことができる。
      ヒープ:
ヒープの利点は、メモリサイズを動的に割り当てることができます。生存期間もコンパイラに教えておく必要がありません。Javaのゴミ収集器は、これらの使用しないデータを自動的に回収します。
ただし、実行時にメモリを動的に割り当てるため、アクセス速度が遅いという欠点があります。
   3.スタックには重要な特殊性があります。つまり、スタック中のデータを共有できます。
 
四.静的ドメイン:
    静的記憶領域とは、一定の位置にアプリケーションが動作している間にずっと存在しているデータを格納し、Javaはメモリの中で静的記憶領域を特定的に区分して、静的データ変数のような特殊なデータ変数を管理しています。明確な点は、Javaオブジェクトはこの場所に存在しないということです。
    クラス変数は静的変数、つまり変数の前にstaticを加えた変数です。    インスタンス変数はオブジェクト変数とも呼ばれます。つまりstaticを入れていない変数です。  違いは:     クラス変数とインスタンス変数の違いは、クラス変数はすべてのオブジェクトが共有されています。オブジェクトの一つはその値を変更し、他のオブジェクトは変更された結果を得ることができます。インスタンス変数はオブジェクトのプライベートです。オブジェクトの値を変更し、他のオブジェクトに影響を与えません。
  特徴:
      ここの「静的」とは、「固定位置にある」という意味です。プログラムの実行中は、静的に格納されたデータがいつでも呼び出しを待ちます。使用可能なstaticキーワードは、オブジェクトの特定の要素が静的であることを指摘する。しかし、Javaオブジェクト自体は、静的記憶空間に永遠に入れられない。    例:
public class A{
    static int a = 0; //   
    private int b = 0; //    
}

public class B{
    public void main (String[] args){
        A a1 = new A();
        A a2 = new A();
        a1.a = 3; //     A.a = 3;
        a1.b = 4 ;
        System.out.println(a2.a); //   3
        //           ,  a1  a,a2 a   
        System.out.println(a2.b); //   0
        //        ,  a1   b  ,     a2 b  
    }
} 
   
五. 定数プール:
定数はJavaでコンパイル期間に確定された、コンパイルされたクラスファイルのデータを保存します。クラス、方法、インターフェースなどの定数も含まれており、String=javaのような文字列定数も含まれています。もちろん拡張もできます。アクチュエータから発生した定数も常量池に入れますので、定数プールはJVMの特殊なメモリ空間だと思います。
  背景:
    Javaオブジェクトの中にはもう一つの特殊な要素があります。定数といいます。定数の値は円周率のように安定しています。このために彼らをコードの内部に置いてもいいです。
    しかし、いくつかの組み込みシステムの開発では、私たちはしばしばそうしない。定数要素とコードを分けて保存します。
    場合によっては通常の値をいくつかの読み取り専用メモリに保存します。これは主にいくつかの特殊な機能のために考えられています。
    著作権によってコントロールされる必要があります。プリンターで消耗材の著作権を保護するために、通常量とコードを分けて保存します。
特徴:
    Javaプログラムには、多くのものが永遠であり、実行中に変化しない。
          たとえば、クラスの名前、クラスのフィールドの名前/所属タイプ、クラスのメソッドの名前/リターンタイプ/パラメータ名と所属タイプ、定数、およびプログラムに大量のワード値が表示されます。
   通常の数値はプログラムコードの内部に直接配置されます。これは安全です。いつまでも変わらないからです。定数によっては厳密に保護される必要があるので、読み取り専用メモリ(ROM)にそれらを入れることが考えられます。
 
六.  非RAMメモリ:
データが完全に一つのプログラムから独立していれば、プログラムが実行されていないときも存在し、プログラムの制御範囲から外れます。その中の二つの最も主要な例は「フローオブジェクト」と「固定オブジェクト」です。流れの対象はバイトフローになり、通常は別のマシンに送られます。固定オブジェクトに対しては、オブジェクトをディスクに保存します。
プログラムが実行を中止しても、彼らは自分の状態を維持することができます。これらのタイプのデータストアにおいて、特に有用な技術は、他のメディアに存在することができることである。必要に応じて、RAMベースのオブジェクトに復元することもできる。
   背景: 
時々、プログラムの実行に必要なデータが他のところに置いてあります。いくつかのシステムでストリームオブジェクトを使用する必要がある場合、このオブジェクトのデータは上記のいずれかの記憶領域に保存されていません。このオブジェクトは直接にバイトストリームに変換され、他のホストに送信されます。もう一つは耐久化という対象があります。それはハードディスクに保存されています。
 
七.各タイプのメモリの実行速度を議論する:
レジスター;スタック>その他
 
 
(C)部屋の猫。すべての権利を留保する。 https://www.cnblogs.com/lsy131479/
転載するなら、出典を明記してください。