工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> Java

Java スタックとヒープ:Java メモリ割り当てのチュートリアル

スタック メモリとは

Java のスタックは、メソッド、ローカル変数、および参照変数を含むメモリのセクションです。スタック メモリは、常に後入れ先出しの順序で参照されます。ローカル変数はスタックに作成されます。

ヒープメモリとは

ヒープは、オブジェクトを含むメモリのセクションであり、参照変数も含む場合があります。インスタンス変数はヒープに作成されます

Java でのメモリ割り当て

Java でのメモリ割り当て 構造体とクラスの変数とインスタンスを格納するために、仮想メモリ セクションがプログラム内に確保されるプロセスです。ただし、宣言時にオブジェクトにメモリが割り当てられず、参照が作成されるだけです。オブジェクトのメモリ割り当てには new() メソッドを使用するため、オブジェクトには常にヒープ上にメモリが割り当てられます。

Java メモリ割り当ては、次のセクションに分かれています:

<オール>
  • ヒープ
  • スタック
  • コード
  • 静的
  • このメモリの分割は、その効果的な管理に必要です。

    ローカル変数とインスタンス変数の違い

    インスタンス変数 クラス内で宣言されていますが、メソッド内では宣言されていません

    class Student{ 
    int num; // num is  instance variable 
    public void showData{}

    ローカル変数 内部で宣言されています を含むメソッド メソッド 引数 .

    public void sum(int a){
    
    int x = int a +  3;
    
    // a , x are local variables;
    
    }

    スタックとヒープの違い

    ビデオにアクセスできない場合は、ここをクリックしてください

    これをよりよく理解するために、例を挙げてみましょう。

    メソッド m1 を呼び出すメイン メソッドを検討してください

    public void m1{
    int x=20
    }

    スタック Java では、メソッド m1 からフレームが作成されます。

    m1 の変数 X は、スタック内の m1 のフレームにも作成されます。 (下の画像を参照してください)。

    メソッド m1 がメソッド m2 を呼び出しています。スタック Java では、フレーム m1 の上に m2 の新しいフレームが作成されます。

    変数 b と c もスタック内のフレーム m2 に作成されます。

    public void m2(int b){
    boolean c;
    }

    同じメソッド m2 がメソッド m3 を呼び出しています。再びフレーム m3 がスタックの一番上に作成されます (下の画像を参照)。

    ここで、メソッド m3 が、変数 int p と int q の 2 つのインスタンスを持つクラス「Account」のオブジェクトを作成しているとします。

    Account {
                 Int p;
                 Int q;
           }

    メソッド m3 のコードは次のとおりです

    public void m3(){
    	Account ref = new Account();
    	// more code
    }

    ステートメント new Account() はアカウントのオブジェクトをヒープに作成します。

    参照変数「ref」は、スタック java に作成されます。

    代入「=」演算子は、ヒープ内のオブジェクトを指す参照変数を作成します。

    メソッドの実行が完了したら。制御の流れは、呼び出し元のメソッドに戻ります。この場合はメソッド m2 です。

    メソッド m3 からのスタックはフラッシュされます。

    参照変数はヒープ内のオブジェクトを指しなくなるため、ガベージ コレクションの対象になります。

    メソッド m2 の実行が完了すると。スタックからポップアウトされ、そのすべての変数がフラッシュされ、使用できなくなります。

    メソッド m1 についても同様です。

    最終的に、制御の流れはプログラムの開始点に戻ります。通常、これが「メイン」メソッドです。

    オブジェクトがインスタンス変数として参照を持っている場合

    public static void main(String args[]) {
      A parent = new A(); //more code } class A{ B child = new B(); int e; //more code } class B{ int c; int d;  //more code }
    

    この場合、参照変数「子」がヒープに作成され、次の図のようにそのオブジェクトを指します。

    まとめ:


    Java

    1. Java 変数とリテラル
    2. Java クラスとオブジェクト
    3. Java 抽象クラスと抽象メソッド
    4. Java のネストされた内部クラス
    5. Java スローとスロー
    6. Java アノテーション タイプ
    7. Java オートボクシングとアンボクシング
    8. Java 文字列 replace()、replaceAll() および replaceFirst() メソッド
    9. Java-オーバーライド
    10. Java 10 - ヒープ割り当て
    11. Java 8 - メソッド参照