Javaでのメモリ割り当てとは何ですか?スタックおよびヒープメモリ



「Javaでのメモリ割り当て」に基づくこの記事は、スタックとヒープのデータ構造とともにメモリ割り当てに関する詳細な知識を提供するのに役立ちます。

メモリ割り当て コンピュータプログラムとサービスが物理的または仮想的に割り当てられるプロセスです 記憶 スペース。この記事では、メモリ割り当てについて学習します。 スタックとヒープメモリについて説明します。

スタックメモリとは何ですか?

Javaスタックメモリは、スレッドの実行に使用されます。これらには、有効期間が短いメソッド固有の値と、メソッドから参照されるヒープ内の他のオブジェクトへの参照が含まれています。





スタック メモリは常にで参照されます LIFO(後入れ先出し) 注文。メソッドが呼び出されるたびに、ローカルプリミティブ値を保持し、メソッド内の他のオブジェクトへの参照を保持するために、メソッドの新しいブロックがスタックメモリに作成されます。

メソッドが終了するとすぐに、ブロックは未使用になり、次のメソッドで使用できるようになります。



スタックメモリサイズは、ヒープメモリと比較して非常に小さくなっています。

スタックメモリの主な機能

これまでに説明したこととは別に、以下は次のいくつかの機能です。 スタック 記憶:

  • 新しいメソッドが呼び出されて返されると、それぞれ拡大および縮小します。
  • スタック内の変数は、それらを作成したメソッドが実行されている間のみ存在します
  • それは 自動的に メソッドの実行が終了すると、割り当てと割り当て解除が行われます
  • このメモリがいっぱいの場合、Javaはスローします java.lang.StackOverFlowError
  • このメモリへのアクセスは 速い ヒープメモリと比較した場合
  • この記憶は スレッドセーフ 各スレッドは独自のスタックで動作するため

Stackクラスのメソッド

  • オブジェクトpush( オブジェクト要素 ): スタックの一番上にある要素をプッシュします。
  • オブジェクトpop(): スタックの最上位要素を削除して返します。アン 「emptyStackException」 呼び出しスタックが空のときにpop()を呼び出すと、例外がスローされます。
  • オブジェクトpeek(): スタックの最上位にある要素を返しますが、削除はしません。
  • ブール値empty(): スタックの最上位に何もない場合はtrueを返します。それ以外の場合は、falseを返します。
  • int search( オブジェクト要素 ): オブジェクトがスタックに存在するかどうかを判別します。要素が見つかった場合は、スタックの一番上から要素の位置を返します。それ以外の場合は、-1を返します。

スタック実装用のJavaコード

import java.io. * importjava.util。* class Test {static void stack_push(Stack stack){for(int i = 0 i<5 i++){ stack.push(i) } } static void stack_pop(Stack stack){ System.out.println('Pop :') for(int i = 0 i < 5 i++){ Integer y = (Integer) stack.pop() System.out.println(y) } } static void stack_peek(Stack stack){ Integer element = (Integer) stack.peek() System.out.println('Element on stack top : ' + element) } static void stack_search(Stack stack, int element){ Integer pos = (Integer) stack.search(element) if(pos == -1) System.out.println('Element not found') else System.out.println('Element is found at position ' + pos) } public static void main (String[] args){ Stack stack = new Stack() stack_push(stack) stack_pop(stack) stack_push(stack) stack_peek(stack) stack_search(stack, 2) stack_search(stack, 6) } } 

//出力



Javaクラスパスを設定する方法

memory-allocation-in-java

それでは、ヒープスペースに移動しましょう。

Javaのヒープスペース

メモリは、プログラマが書き込んだ命令の実行中に割り当てられます。ヒープという名前は、ヒープのデータ構造とは関係がないことに注意してください。これは、プログラマーが使用できるメモリスペースの山であるため、ヒープと呼ばれます。 割り当てられた そして 割り当てを解除します。 プログラマーがこのメモリをうまく処理しない場合、メモリリークが発生する可能性がありますプログラムで起こります。

Javaヒープメモリの主な機能

  • これまでに説明したこととは別に、ヒープスペースのその他の機能は次のとおりです。
  • これには、次のような複雑なメモリ管理手法を介してアクセスします。 若い世代、古い または テニュア世代、 そして パーマネントジェネレーション
  • ヒープスペースがいっぱいの場合、Javaはスローします java.lang.OutOfMemoryError
  • このメモリへのアクセスは、スタックメモリよりも比較的低速です
  • このメモリは、スタックとは対照的に、自動的に割り当て解除されません。が必要だ ガベージコレクター メモリ使用の効率を維持するために未使用のオブジェクトを解放する
  • スタックとは異なり、ヒープはそうではありません スレッドセーフ コードを適切に同期して保護する必要があります

Javaヒープスペースとスタックメモリの違い

上記の説明に基づいて、次の違いを簡単に結論付けることができます。 ヒープ そして スタック メモリ。

  • ヒープ メモリはアプリケーションのすべての部分で使用されますが、スタックメモリは1つの実行スレッドでのみ使用されます。
  • オブジェクトが作成されるたびに、そのオブジェクトは常にヒープスペースに格納され、スタックメモリにはそのオブジェクトへの参照が含まれます。スタックメモリには ローカルプリミティブ変数 そして 参照変数 ヒープスペース内のオブジェクトに。
  • ヒープに格納されているオブジェクトにはグローバルにアクセスできますが、スタックメモリには他のスレッドからアクセスできません。
  • スタック内のメモリ管理は、 LIFO グローバルに使用されるため、ヒープメモリではより複雑になります。ヒープメモリはに分割されます 若い世代、古い世代 など、詳細はJavaガベージコレクションをご覧ください。
  • スタックメモリは 短命 一方、ヒープメモリは、アプリケーションの実行の開始から終了まで存続します。
  • 使用できます -XMX そして -XMS ヒープメモリの起動サイズと最大サイズを定義するJVMオプション。使用できます -XSS スタックメモリサイズを定義します。
  • スタックメモリがいっぱいになると、Javaランタイムはスローします java.lang.StackOverFlowError 一方、ヒープメモリがいっぱいになると、 java.lang.OutOfMemoryError: Javaヒープスペースエラー。
  • スタックメモリサイズは、ヒープメモリと比較すると非常に小さくなります。メモリ割り当てが単純なため (LIFO)、 スタックメモリは、比較すると非常に高速ですヒープメモリ。

比較表

パラメータ スタック ヒープ
基本 メモリは連続ブロックに割り当てられますメモリはランダムな順序で割り当てられます
割り当てと割り当て解除 コンパイラによる自動プログラマーによるマニュアル
費用 もっと少なくもっと
実装 ハード簡単
アクセス時間 もっと早くもっとゆっくり
主な問題 メモリ不足メモリの断片化
違いの局所性 優秀な適切な
柔軟性 固定金利サイズ変更が可能

これで、この「Javaでのメモリ割り当て」チュートリアルは終了です。いくつかのリアルタイムの例を通して、概念とその実装を理解していただければ幸いです。

これで理解できましたJavaでのメモリ割り当てこの「Javaでのメモリ割り当て」の記事の基本は、 25万人以上の満足した学習者のネットワークを持つ信頼できるオンライン学習会社であるEdurekaが世界中に広がっています。 EdurekaのJavaJ2EEおよびSOAトレーニングおよび認定コースは、Java開発者になりたい学生および専門家向けに設計されています。このコースは、Javaプログラミングをすぐに開始できるように設計されており、Hibernateや

質問がありますか?この「Javaでのメモリ割り当て」ブログのコメントセクションで言及してください。できるだけ早くご連絡いたします。