JAVAの中でメモリとスタックのメモリの違いを簡単に述べます。
Javaはメモリを二つに分けます。一つはスタックメモリで、一つはメモリを積むことです。
一、スタックメモリ
基本型の変数を格納し、オブジェクトの参照とメソッド呼び出しは、先入後出の原則に従います。
スタック内の関数で定義されている「いくつかの基本的なタイプの変数とオブジェクトの参照変数」は、関数のスタックメモリに割り当てられます。あるコードブロックで変数を定義すると、Javaはこの変数のためにメモリ空間を割り当て、変数の作用領域を超えると、Javaは変数に割り当てられたメモリ空間を自動的に解放し、そのメモリ空間は直ちに別のものとして使用することができる。
Javaのコードは関数で実行されます。各関数本体はスタックメモリに保存されます。例えば、main関数です。main関数で他の関数を呼び出したら、例えばadd()は、スタックの中の記憶は一番下の階にあるmainで、mianの上にaddがあります。スタックの運行時に先着順に入るので、実行時にはaddを破壊してから、メールを廃棄します。
スタックの利点は、スタックメモリはヒープメモリと比べて非常に小さく、アクセス速度はヒープよりも速く、レジスターに次ぎ、スタックデータは共有できます。しかし、スタック中のデータサイズと生存期間は決定されなければならず、柔軟性がないという欠点がある。スタックには主にいくつかの基本的な変数(int、shot、long、byte、float、double、bootlean、char)と対象のハンドルが格納されています。スタックには重要な特殊性があります。つまり、スタック中のデータを共有できます。
二、ヒープメモリ
すべてのnewからのオブジェクトと配列を保存します。
特にここで強調します。ヒープメモリとデータ構造のヒープは全く別のものです。分配方式はチェーンテーブルと似ています。
ヒープメモリはスタックエリア、グローバルデータエリア、コードエリアとは別のメモリエリアです。ヒープ許容プログラムは、実行時にあるサイズのメモリ空間を動的に申請します。ヒープメモリとは、実際には(ヒープメモリの性質を満たす)優先キューの一種のデータ構造を指しています。1番目の要素は最高の優先権を持っています。
メモリの割り当てでは、まず、オペレーティングシステムがアイドルメモリアドレスを記録するリンクテーブルを持っていることを知っておくべきです。システムがプログラムの申請を受けた時に、チェーンテーブルを巡回して、最初の空間が申請空間より大きいヒープを探します。そして、そのノードをアイドルリンクから削除して、このノードの空間をプログラムに割り当てます。このメモリ空間の先頭アドレスに今回割り当てられたサイズを記録します。このようにコードの中のdelete文がメモリ空間を正しく解放することができます。
また、見つかった積み重ねの大きさは必ずしも申請の大きさに等しくないため、システムは自動的に余分な部分を空きチェーンに再投入します。ヒープメモリは高アドレスに拡張されたデータ構造で、不連続なメモリ領域です。これは、システムがチェーンで記憶されている空きメモリアドレスであるため、当然不連続であり、チェーンテーブルのエルゴード方向は低アドレスから高アドレスに向けられている。ヒープメモリのサイズはコンピュータシステムの有効な仮想メモリに制限されています。このことから、ヒープメモリで得られた空間は比較的に柔軟であり、比較的大きい。ヒープメモリはnewで割り当てられたメモリで、一般的に速度が遅く、メモリの破片が発生しやすいですが、一番使いやすいです。
スタックとスタックはJavaでRamにデータを保存するところです。C++と違って、Java自動管理スタックとヒープは、プログラマが直接にスタックやヒープを設置することができません。
Javaのヒープは実行時のデータエリアであり、クラスの(対象が中から空間を割り当てます。これらのオブジェクトは、新規、newarray、anwaray、multinewarrayなどのコマンドによって構築され、プログラムコードを必要とせずに明示的にリリースされます。ヒープはゴミ回収によって責任があります。ヒープの利点はメモリサイズを動的に割り当てることができます。生存期間も事前にコンパイラに教えなくてもいいです。それは運行時にメモリを動的に割り振るので、Javaのゴミ収集器は自動的にこれらの使用しないデータを回収します。ただし、実行時にメモリを動的に割り当てるため、アクセス速度が遅いという欠点があります。
三、他のデータ記憶
1、定数池:基本タイプの定数と文字列定数(public static final)を保存する。
2、静的ドメイン:スタティックメンバー(static定義の)を保存する。
3、RAM以外の記憶:ハードディスクなどの永久記憶空間
ヒープメモリとスタックメモリの違い:
1、アプリケーションのすべての部分はヒープメモリを使用し、スタックメモリはスレッドを介して実行します。
2、対象がいつ作成されても、彼はメモリの中に保存されます。スタックにはその引用が含まれています。スタックメモリには元の値変数とスタック内のオブジェクト変数の参照のみが含まれます。
3、スタックに格納されているオブジェクトはグローバルにアクセスできるが、スタックメモリは他のスレッドにアクセスできない。
4、スタックの中のメモリ管理はLIFOを使って完成しますが、メモリの管理はもっと複雑になります。それは全体的にアクセスされているからです。
5、スタックメモリはライフサイクルが短いですが、メモリを積むライフサイクルはプログラムの運行から運行終了までです。
6、私たちは-Xmsと-Xmx JVMオプションを使って、最初のサイズとメモリの最大値を定義できます。私たちは-Xssを使ってスタックのサイズを定義できます。
7、スタックのメモリがいっぱいになったら、Javaがjava.lang.Stock OverFloweErrを投げて異常にメモリをいっぱいにした時、java.lang.OutOfMemoryErrを投げます。Java Heap Spaceエラー
8、スタックメモリと比べて、スタックメモリはかなり小さいです。メモリ割り当て規則(LIFO)を明確に使用していますので、スタックメモリと比べて非常に速いです。
まとめ:
1スタック:コンパイラのために、関数パラメータ、局所変数、一時変数などの自動的な割り当てとリリースを行います。
2山:メンバーの割り当てとリリースのために、プログラマが自分で申請し、自分で釈放します。メモリ漏れが発生します。典型的にはnewアプリケーションを使用するためのスタック内容です。
この二つの部分以外に、もう一つは:
3静的記憶エリア:メモリはプログラムのコンパイル時にすでに割り当てられています。この中にはプログラムが存在する全動作期間があります。主に静的データ、グローバルデータ、定数を保存します。
以上はJAVAの中でメモリとスタックのメモリの違いの詳しい内容を簡単に述べました。JAVAの中でメモリとスタックのメモリの資料について、他の関連記事に注目してください。
一、スタックメモリ
基本型の変数を格納し、オブジェクトの参照とメソッド呼び出しは、先入後出の原則に従います。
スタック内の関数で定義されている「いくつかの基本的なタイプの変数とオブジェクトの参照変数」は、関数のスタックメモリに割り当てられます。あるコードブロックで変数を定義すると、Javaはこの変数のためにメモリ空間を割り当て、変数の作用領域を超えると、Javaは変数に割り当てられたメモリ空間を自動的に解放し、そのメモリ空間は直ちに別のものとして使用することができる。
Javaのコードは関数で実行されます。各関数本体はスタックメモリに保存されます。例えば、main関数です。main関数で他の関数を呼び出したら、例えばadd()は、スタックの中の記憶は一番下の階にあるmainで、mianの上にaddがあります。スタックの運行時に先着順に入るので、実行時にはaddを破壊してから、メールを廃棄します。
スタックの利点は、スタックメモリはヒープメモリと比べて非常に小さく、アクセス速度はヒープよりも速く、レジスターに次ぎ、スタックデータは共有できます。しかし、スタック中のデータサイズと生存期間は決定されなければならず、柔軟性がないという欠点がある。スタックには主にいくつかの基本的な変数(int、shot、long、byte、float、double、bootlean、char)と対象のハンドルが格納されています。スタックには重要な特殊性があります。つまり、スタック中のデータを共有できます。
二、ヒープメモリ
すべてのnewからのオブジェクトと配列を保存します。
特にここで強調します。ヒープメモリとデータ構造のヒープは全く別のものです。分配方式はチェーンテーブルと似ています。
ヒープメモリはスタックエリア、グローバルデータエリア、コードエリアとは別のメモリエリアです。ヒープ許容プログラムは、実行時にあるサイズのメモリ空間を動的に申請します。ヒープメモリとは、実際には(ヒープメモリの性質を満たす)優先キューの一種のデータ構造を指しています。1番目の要素は最高の優先権を持っています。
メモリの割り当てでは、まず、オペレーティングシステムがアイドルメモリアドレスを記録するリンクテーブルを持っていることを知っておくべきです。システムがプログラムの申請を受けた時に、チェーンテーブルを巡回して、最初の空間が申請空間より大きいヒープを探します。そして、そのノードをアイドルリンクから削除して、このノードの空間をプログラムに割り当てます。このメモリ空間の先頭アドレスに今回割り当てられたサイズを記録します。このようにコードの中のdelete文がメモリ空間を正しく解放することができます。
また、見つかった積み重ねの大きさは必ずしも申請の大きさに等しくないため、システムは自動的に余分な部分を空きチェーンに再投入します。ヒープメモリは高アドレスに拡張されたデータ構造で、不連続なメモリ領域です。これは、システムがチェーンで記憶されている空きメモリアドレスであるため、当然不連続であり、チェーンテーブルのエルゴード方向は低アドレスから高アドレスに向けられている。ヒープメモリのサイズはコンピュータシステムの有効な仮想メモリに制限されています。このことから、ヒープメモリで得られた空間は比較的に柔軟であり、比較的大きい。ヒープメモリはnewで割り当てられたメモリで、一般的に速度が遅く、メモリの破片が発生しやすいですが、一番使いやすいです。
スタックとスタックはJavaでRamにデータを保存するところです。C++と違って、Java自動管理スタックとヒープは、プログラマが直接にスタックやヒープを設置することができません。
Javaのヒープは実行時のデータエリアであり、クラスの(対象が中から空間を割り当てます。これらのオブジェクトは、新規、newarray、anwaray、multinewarrayなどのコマンドによって構築され、プログラムコードを必要とせずに明示的にリリースされます。ヒープはゴミ回収によって責任があります。ヒープの利点はメモリサイズを動的に割り当てることができます。生存期間も事前にコンパイラに教えなくてもいいです。それは運行時にメモリを動的に割り振るので、Javaのゴミ収集器は自動的にこれらの使用しないデータを回収します。ただし、実行時にメモリを動的に割り当てるため、アクセス速度が遅いという欠点があります。
三、他のデータ記憶
1、定数池:基本タイプの定数と文字列定数(public static final)を保存する。
2、静的ドメイン:スタティックメンバー(static定義の)を保存する。
3、RAM以外の記憶:ハードディスクなどの永久記憶空間
ヒープメモリとスタックメモリの違い:
1、アプリケーションのすべての部分はヒープメモリを使用し、スタックメモリはスレッドを介して実行します。
2、対象がいつ作成されても、彼はメモリの中に保存されます。スタックにはその引用が含まれています。スタックメモリには元の値変数とスタック内のオブジェクト変数の参照のみが含まれます。
3、スタックに格納されているオブジェクトはグローバルにアクセスできるが、スタックメモリは他のスレッドにアクセスできない。
4、スタックの中のメモリ管理はLIFOを使って完成しますが、メモリの管理はもっと複雑になります。それは全体的にアクセスされているからです。
5、スタックメモリはライフサイクルが短いですが、メモリを積むライフサイクルはプログラムの運行から運行終了までです。
6、私たちは-Xmsと-Xmx JVMオプションを使って、最初のサイズとメモリの最大値を定義できます。私たちは-Xssを使ってスタックのサイズを定義できます。
7、スタックのメモリがいっぱいになったら、Javaがjava.lang.Stock OverFloweErrを投げて異常にメモリをいっぱいにした時、java.lang.OutOfMemoryErrを投げます。Java Heap Spaceエラー
8、スタックメモリと比べて、スタックメモリはかなり小さいです。メモリ割り当て規則(LIFO)を明確に使用していますので、スタックメモリと比べて非常に速いです。
まとめ:
1スタック:コンパイラのために、関数パラメータ、局所変数、一時変数などの自動的な割り当てとリリースを行います。
2山:メンバーの割り当てとリリースのために、プログラマが自分で申請し、自分で釈放します。メモリ漏れが発生します。典型的にはnewアプリケーションを使用するためのスタック内容です。
この二つの部分以外に、もう一つは:
3静的記憶エリア:メモリはプログラムのコンパイル時にすでに割り当てられています。この中にはプログラムが存在する全動作期間があります。主に静的データ、グローバルデータ、定数を保存します。
以上はJAVAの中でメモリとスタックのメモリの違いの詳しい内容を簡単に述べました。JAVAの中でメモリとスタックのメモリの資料について、他の関連記事に注目してください。