「JVMメモリ構造」「Javaメモリモデル」「Javaオブジェクトモデル」がわかる一冊

Java はオブジェクト指向のクロスプラットフォーム言語であり、そのオブジェクト、メモリなどは常に比較的難しい知識ポイントでした。さらに、多くの概念の名前は非常に似ているため、多くの人はそれらを区別できません。たとえば、この記事で説明する JVM メモリ構造、Java メモリ モデル、および Java オブジェクト モデルは、3 つのまったく異なる概念ですが、多くの人がこれらを混同しがちです。

多くの上級開発者は、JVM メモリ構造、Java メモリ モデル、Java オブジェクト モデルの概念とそれらの違いさえ理解していないと言えます。私でさえ、それについてあまり明確ではないインタビュアーを見たことがあります。信じられないかもしれませんが、インターネットで Java メモリ モデルを検索すると、実際に JVM のメモリ構造を紹介している記事がたくさんあります。

まず、これらの 3 つの概念は 3 つのまったく異なる概念です。本稿では、主にこれら 3 つの概念を区別し、簡単に紹介します。これらの知識ポイントはそれぞれ別の記事として書くことができ、この記事では詳しく紹介しません。

JVM メモリ構造

Java コードは仮想マシン上で実行され、仮想マシンは Java プログラムの実行中にマネージド メモリをいくつかの異なるデータ領域に分割し、これらの領域には独自の目的があることは誰もが知っています。

これらの領域の一部は仮想マシン プロセスの開始とともに存在しますが、一部の領域はユーザー スレッドの開始と終了に応じて確立および破棄されます。「Java Virtual Machine Specification (Java SE 8)」では、JVM 実行時メモリ領域の構造を次のように記述しています。

各領域の機能は、この記事の焦点では​​ないため、ここでは詳しく紹介しません。以下に、特に注意が必要な点をいくつか示します。

  1. 上記は Java 仮想マシンの仕様であり、仮想マシンの実装が異なれば異なりますが、通常は仕様に従います。

  1. 仕様で定義されているメソッド領域は概念的な領域にすぎず、どのような機能を持つべきかを説明しています。しかし、この領域がどこにあるべきかを正確に指定していません。したがって、さまざまな仮想マシンの実装にはある程度の自由度があります。

3. 異なるバージョンのメソッド領域の位置は異なります. 上図の区分は論理的な領域であり、絶対的な意味での物理的な領域ではありません. JDK の一部のバージョンでは、メソッド領域が実際にはヒープに実装されているためです。

4. ランタイム定数プールは、コンパイル中に生成されたさまざまなリテラルおよびシンボル アプリケーションを格納するために使用されます。ただし、Java 言語では、コンパイル時にのみ定数を生成する必要はありません。たとえば、実行時に、String.intern は新しい定数もプールに入れます。

5. 上記の JVM ランタイム メモリに加えて、使用可能なメモリ領域、つまりダイレクト メモリもあります。このメモリ領域は Java 仮想マシンの仕様では定義されていないため、JVM では管理されず、ローカル メソッド ライブラリを使用してヒープ外に直接適用されるメモリ領域です。

6. ヒープとスタックのデータ分割は絶対的なものではなく、たとえば、HotSpot の JIT はそれに応じてオブジェクトの割り当てを最適化します。

上記のように、要約すると、JVM メモリ構造は Java 仮想マシン仕様によって定義されます。Java プログラムの実行中に JVM によって管理されるさまざまなデータ領域について説明します。各領域には特定の機能があります。

Java メモリ モデル

Javaのメモリモデルは、Javaのメモリ構造(JVMのメモリ構造)と似ていますが、両者を同じものと勘違いしている人が多く、面接で間違った回答をすることがよくあります。

JVM のメモリ構造に関する前の図では、Java ヒープとメソッド領域の領域が複数のスレッドによって共有されるデータ領域であることがわかります。つまり、複数のスレッドが、ヒープやメソッド領域に格納された同じデータを操作できる場合があります。これは、「Java スレッドが共有メモリを介して通信する」とよく言われることです。

Java メモリ モデルは、英語の Java メモリ モデル (JMM) から翻訳されています。実際、JMM は JVM メモリ構造ほどリアルではありません。彼は単なる抽象的な概念です。JSR-133: Java Memory Model and Thread Specification, JMM is related to multithreading. JMM is related to multithreading. It describes a set of rules or specification. この仕様は、スレッドが共有変数に書き込むとき、それが別のスレッドから見えることを定義します。 .

では、簡単にまとめると、Javaのマルチスレッドは共有メモリを介して通信を行っており、通信に共有メモリを使用しているため、通信プロセスにおける可視性、アトミック性、順序などの問題が相次ぎ、JMMではマルチスレッド通信とそれに関連する一連の機能を中心に構築されたモデルです。JMM はいくつかの文法セットを定義します。これらの文法セットは、Java 言語で volatile や synchronized などのキーワードにマップされます。

JMM では、複数のスレッド間で通信するための共有メモリをメイン メモリと呼びますが、並行プログラミングでは、複数のスレッドが独自のローカル メモリを維持し (これは抽象的な概念です)、そこに格納されたデータはメイン メモリのデータ コピーです。 . JMM は主に、ローカル メモリとメイン メモリ間のデータのやり取りを制御します。

在Java中,JMM是一个非常重要的概念,正是由于有了JMM,Java的并发编程才能避免很多问题。这里就不对Java内存模型做更加详细的介绍了,想了解更多的朋友可以参考《Java并发编程的艺术》。

Java对象模型

Java是一种面向对象的语言,而Java对象在JVM中的存储也是有一定的结构的。而这个关于Java对象自身的存储模型称之为Java对象模型。

HotSpot虚拟机中,设计了一个OOP-Klass Model。OOP(Ordinary Object Pointer)指的是普通对象指针,而Klass用来描述对象实例的具体类型。

每一个Java类,在被JVM加载的时候,JVM会给这个类创建一个instanceKlass,保存在方法区,用来在JVM层表示该Java类。当我们在Java代码中,使用new创建一个对象的时候,JVM会创建一个instanceOopDesc对象,这个对象中包含了对象头以及实例数据。

这就是一个简单的Java对象的OOP-Klass模型,即Java对象模型。

总结

我们再来区分下JVM内存结构、 Java内存模型 以及 Java对象模型 三个概念。

JVM内存结构,和Java虚拟机的运行时区域有关。

Java内存模型,和Java的并发编程有关。

Java对象模型,和Java对象在虚拟机中的表现形式有关。

关于这三部分内容,本文并未分别展开,因为涉及到的知识点实在太多,如果读者感兴趣,可以自行学习。

最后,这三个概念非常重要,一定要严格区分开,千万不要在面试中出现答非所为的情况。

おすすめ

転載: blog.csdn.net/peterjava123/article/details/129123975