検索
ホームページJava&#&チュートリアルJavaのメモリの仕組みを画像と文章で詳しく解説

この記事では、Java のメモリ機構に関する関連知識を中心に紹介します。非常に参考になる内容です。エディターで見てみましょう。

Java では、メモリが 2 種類に分けられます。1 つはスタック メモリ、もう 1 つはヒープです。メモリ。 関数内で定義されたいくつかの基本的なタイプの変数とオブジェクト参照変数は、関数のスタック メモリに割り当てられます。変数がコード ブロック内で定義されると、Java はスタック内の変数にメモリ領域を割り当てます。変数のスコープ (たとえば、関数 A で関数 B を呼び出し、関数 B で変数 a を定義します。変数 a のスコープは関数 B のみです。関数 B の実行後、変数 a は自動的に破棄されます。それに割り当てられた値)メモリはリサイクルされます)、Java は変数に割り当てられたメモリ領域を自動的に解放し、そのメモリ領域を他の目的にすぐに使用できるようになります。

ヒープメモリは、newによって作成されたメモリ配列を格納するために使用されます。ヒープに割り当てられたメモリは、Java仮想マシンの自動ガベージコレクタによって管理されます。ヒープ内に配列またはオブジェクトを生成した後、スタック内の変数の値がヒープ メモリ内の配列またはオブジェクトの最初のアドレスと等しくなるように、スタック内に特殊な変数を定義することもできます。スタックは配列またはオブジェクトの参照変数を取得した後、プログラム内でスタック内の変数を使用してヒープ内の配列またはオブジェクトにアクセスできます。参照変数は配列またはオブジェクトに名前を付けることと同じです。参照変数は、定義時にスタックに割り当てられる通常の変数で、プログラムが他のスコープ外で実行された後に解放されます。配列とオブジェクトはヒープ内に割り当てられます。new によって生成された配列またはオブジェクト ステートメントが配置されているコード ブロックの外でプログラムが実行された場合でも、配列とオブジェクトによって占有されていたメモリは解放されません。配列とオブジェクトを指す参照変数が存在しない場合、それらはガベージとなり、後で不定の時点でガベージ コレクターによって収集 (解放) されます。これは、Java がより多くのメモリを消費する理由でもあります。実際、スタック内の変数は、Java のポインタであるヒープ メモリ内の変数を指します。

コード例 Demo1: 単一オブジェクトの作成

class Person {
 String name ;
 int age ;
 public void tell() {
  System.out.println("姓名:"+name+",年龄:"+age);
 }
}
public class Demo1 {
 public static void main(String[] args) {
  Person per = new Person() ;
 }
}

上記のプログラムでは、インスタンス化プロセス中に、スタック メモリとヒープ メモリを含むメモリ内の領域を解放する必要があります。メモリ割り当ては次の図に示されています:

Javaのメモリの仕組みを画像と文章で詳しく解説

図 1-1 オブジェクトのインスタンス化プロセス

上の図から、オブジェクト名ごとにスタック メモリに保存されていることがわかります (より正確には、スタック メモリに保存されるのはヒープ メモリ空間のアクセス アドレス) であり、属性名前や年齢などのオブジェクトの特定の内容がヒープ メモリに保存されます。 per オブジェクトはインスタンス化されただけで特定の値が割り当てられていないため、デフォルト値が設定されています。 stringのデフォルト値はnull、int型のデフォルト値は0です。前述したように、ヒープ メモリ空間は new キーワードを使用して開く必要があります。

コード例 Demo2: 複数のオブジェクトの作成

class Person {
 String name ;
 int age ;
 public void tell() {
  System.out.println("姓名:"+name+",年龄:"+age);
 }
}
public class Demo2 {
 public static void main(String[] args) {
  Person per1 = new Person() ;
  Person per2 = new Person() ;
  per1.name="张三" ;
  per1.age=30 ;
  per2.age=33 ;
  per1.tell(); 
  per2.tell(); 
 }
}

Javaのメモリの仕組みを画像と文章で詳しく解説

図 1-2 2 つのオブジェクトをインスタンス化する

主要な概念: 配列と同様、クラスは参照型であり、参照型は同じ A ヒープ メモリを参照します複数のスタック メモリによってポイントされる可能性があります。参照渡しの簡単な例を見てみましょう。

コード例 Demo3: オブジェクト参照転送1

class Person {
 String name ;
 int age ;
 public void tell() {
  System.out.println("姓名:"+name+",年龄:"+age);
 }
}
public class Demo3 {
 public static void main(String[] args) {
  Person per1 = new Person() ;
  Person per2 = per1 ;//-------注意--------
  per1.name="张三" ;
  per1.age=30 ;
  per2.age=33 ;
  per1.tell(); 
  per2.tell(); 
 }
}

プログラムの実行結果は次のとおりです:

Javaのメモリの仕組みを画像と文章で詳しく解説

プログラムの実行結果から、2つのオブジェクトが出力する内容は同じであることがわかります。実際、いわゆる参照転送とは、1 つのヒープ メモリ空間の使用権を複数のスタック メモリ空間に与えることです。各スタック メモリ空間は、ヒープ メモリ空間の内容を変更できます。このプログラムのメモリ割り当て図は次のとおりです。

Javaのメモリの仕組みを画像と文章で詳しく解説

図 1-3 オブジェクト参照のメモリ割り当ての受け渡し

Javaのメモリの仕組みを画像と文章で詳しく解説

図 1-3 オブジェクト参照のメモリ割り当ての受け渡し (続き)

注: 上記の例では、オブジェクトper2 にはヒープ メモリ領域がありません。これは、オブジェクト per2 が宣言操作のみを実行するためであり、インスタンス化操作もありません。 new キーワードを使用するだけで、インスタンス化後にヒープ メモリ領域が確保されます

コード例 Demo4: オブジェクト参照転送 2

 class Person {
 String name ;
 int age ;
 public void tell() {
  System.out.println("姓名:"+name+",年龄:"+age);
 }
}
public class Demo4 {
 public static void main(String[] args) {
  Person per1 = new Person() ;
  Person per2 = new Person() ;
  per1.name="张三" ;
  per1.age=30 ;
  per2.name="李四" ;
  per2.age=33 ;
  per2=per1 ;//-----注意----
  per1.tell(); 
  per2.tell(); 
 }
}

上記のプログラムの実行結果は次のとおりです:

Javaのメモリの仕組みを画像と文章で詳しく解説

プログラムの出力から、Demo3 と似ていることがわかります。ただし、以下に示すように、メモリ割り当てにいくつかの変更が加えられています。

Javaのメモリの仕組みを画像と文章で詳しく解説

図 1-4 (ガベージ オブジェクト) の生成

注:

1. Java 自体がガベージ コレクション メカニズム (ガベージ コレクション、 GC) は、オブジェクトが使用されなくなっている限り、上記のヒープ メモリ内の name="李思";age=33 などの領域が GC によって解放されるまで待機します。 。

2. スタック メモリは 1 つのヒープ メモリ空間のみを指すことができ、他のヒープ メモリ空間を指す場合は、新しいポインタを割り当てる前に、まず既存のポインタを切断する必要があります。

Javaの共通メモリ領域

Javaには主に4つのメモリ空間があり、これらのメモリの名前と機能は次のとおりです:

1.スタックメモリ空間:すべてのオブジェクトの名前を保存します。

2. ヒープメモリ空間: 各オブジェクトの特定の属性内容を保存します。

3. グローバルデータ領域:静的型の属性値を保存します。

4. グローバルコード領域: すべてのメソッド定義を保存します。

以上がJavaのメモリの仕組みを画像と文章で詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Javaがクロスプラットフォームデスクトップアプリケーションを開発するための人気のある選択肢なのはなぜですか?Javaがクロスプラットフォームデスクトップアプリケーションを開発するための人気のある選択肢なのはなぜですか?Apr 25, 2025 am 12:23 AM

javaispopularforsoss-platformdesktopapplicationsduetoits "writeonce、runaynay" philosophy.1)itusesbytecodatiTatrunnanyjvm-adipplatform.2)ライブラリリケンディンガンドジャヴァフククレアティック - ルルクリス

Javaでプラットフォーム固有のコードを作成する必要がある場合がある状況について話し合います。Javaでプラットフォーム固有のコードを作成する必要がある場合がある状況について話し合います。Apr 25, 2025 am 12:22 AM

Javaでプラットフォーム固有のコードを作成する理由には、特定のオペレーティングシステム機能へのアクセス、特定のハードウェアとの対話、パフォーマンスの最適化が含まれます。 1)JNAまたはJNIを使​​用して、Windowsレジストリにアクセスします。 2)JNIを介してLinux固有のハードウェアドライバーと対話します。 3)金属を使用して、JNIを介してMacOSのゲームパフォーマンスを最適化します。それにもかかわらず、プラットフォーム固有のコードを書くことは、コードの移植性に影響を与え、複雑さを高め、パフォーマンスのオーバーヘッドとセキュリティのリスクをもたらす可能性があります。

プラットフォームの独立性に関連するJava開発の将来の傾向は何ですか?プラットフォームの独立性に関連するJava開発の将来の傾向は何ですか?Apr 25, 2025 am 12:12 AM

Javaは、クラウドネイティブアプリケーション、マルチプラットフォームの展開、および言語間の相互運用性を通じて、プラットフォームの独立性をさらに強化します。 1)クラウドネイティブアプリケーションは、GraalvmとQuarkusを使用してスタートアップ速度を向上させます。 2)Javaは、埋め込みデバイス、モバイルデバイス、量子コンピューターに拡張されます。 3)Graalvmを通じて、JavaはPythonやJavaScriptなどの言語とシームレスに統合して、言語間の相互運用性を高めます。

Javaの強力なタイピングは、プラットフォームの独立性にどのように貢献しますか?Javaの強力なタイピングは、プラットフォームの独立性にどのように貢献しますか?Apr 25, 2025 am 12:11 AM

Javaの強力なタイプ化されたシステムは、タイプの安全性、統一タイプの変換、多型を通じてプラットフォームの独立性を保証します。 1)タイプの安全性は、コンパイル時間でタイプチェックを実行して、ランタイムエラーを回避します。 2)統一された型変換ルールは、すべてのプラットフォームで一貫しています。 3)多型とインターフェイスメカニズムにより、コードはさまざまなプラットフォームで一貫して動作します。

Javaネイティブインターフェイス(JNI)がプラットフォームの独立性をどのように妥協できるかを説明します。Javaネイティブインターフェイス(JNI)がプラットフォームの独立性をどのように妥協できるかを説明します。Apr 25, 2025 am 12:07 AM

JNIはJavaのプラットフォームの独立を破壊します。 1)JNIは特定のプラットフォームにローカルライブラリを必要とします。2)ローカルコードをターゲットプラットフォームにコンパイルおよびリンクする必要があります。3)異なるバージョンのオペレーティングシステムまたはJVMは、異なるローカルライブラリバージョンを必要とする場合があります。

Javaのプラットフォームの独立性を脅かしたり強化したりする新しいテクノロジーはありますか?Javaのプラットフォームの独立性を脅かしたり強化したりする新しいテクノロジーはありますか?Apr 24, 2025 am 12:11 AM

新しいテクノロジーは、両方の脅威をもたらし、Javaのプラットフォームの独立性を高めます。 1)Dockerなどのクラウドコンピューティングとコンテナ化テクノロジーは、Javaのプラットフォームの独立性を強化しますが、さまざまなクラウド環境に適応するために最適化する必要があります。 2)WebAssemblyは、Graalvmを介してJavaコードをコンパイルし、プラットフォームの独立性を拡張しますが、パフォーマンスのために他の言語と競合する必要があります。

JVMのさまざまな実装は何ですか、そしてそれらはすべて同じレベルのプラットフォームの独立性を提供しますか?JVMのさまざまな実装は何ですか、そしてそれらはすべて同じレベルのプラットフォームの独立性を提供しますか?Apr 24, 2025 am 12:10 AM

JVMの実装が異なると、プラットフォームの独立性が得られますが、パフォーマンスはわずかに異なります。 1。OracleHotspotとOpenJDKJVMは、プラットフォームの独立性で同様に機能しますが、OpenJDKは追加の構成が必要になる場合があります。 2。IBMJ9JVMは、特定のオペレーティングシステムで最適化を実行します。 3. Graalvmは複数の言語をサポートし、追加の構成が必要です。 4。AzulzingJVMには、特定のプラットフォーム調整が必要です。

プラットフォームの独立性は、開発コストと時間をどのように削減しますか?プラットフォームの独立性は、開発コストと時間をどのように削減しますか?Apr 24, 2025 am 12:08 AM

プラットフォームの独立性により、開発コストが削減され、複数のオペレーティングシステムで同じコードセットを実行することで開発時間を短縮します。具体的には、次のように表示されます。1。開発時間を短縮すると、1セットのコードのみが必要です。 2。メンテナンスコストを削減し、テストプロセスを統合します。 3.展開プロセスを簡素化するための迅速な反復とチームコラボレーション。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません