JVMのメモリ構造、JavaのメモリモデルとJavaオブジェクト・モデルの3つの概念を区別

本論文では、で構成されていジェーン・ワイアットSimpReadのトランスコーディング、元のアドレスhttps://www.toutiao.com/i6732361325244056072/

作者:Hollis 
来源:公众号Hollis 

オブジェクト指向、クロスプラットフォームの言語、その目的およびメモリなどのJavaは、より困難な知識ポイントとなっています。そして、名前や概念の多くは非常に似て、多くの人が無邪気に言うことができなかっただろうと思われます。たとえば、この記事で我々は議論するJVMのメモリアーキテクチャJavaのメモリモデルJavaのオブジェクトモデル 3つの異なる概念である、しかし、多くの人が混乱する傾向があります。

多くのシニアの開発者でもJVMのメモリ構造、JavaのメモリモデルとJavaオブジェクト・モデルの概念の間と3これらの違いを知っていないと言うことができます。私はいくつかのも、自分自身があまりにも明確ではないインタビュアーに係合見てきました。それを信じてはいけない、あなたはJavaのメモリモデルを検索するためにオンラインに、実際に導入された内容の記事がたくさんあるだろうJVMのメモリ構造です。

まず第一に、これらの3つの概念は全く異なる3つの概念です。本論文では、これら3つの概念の区別だけでなく、簡単な紹介。知識は別の記事を書くことができ、それぞれが、私が興味を持って友人が私の知識の惑星のゴルファーに参加し、一緒に学ぶことができ、綿密なレポートを行くことはありません。

JVMのメモリ構造

我々は、すべてのJavaプログラムの実行中の仮想マシン、仮想マシンのメモリ部門で実行するJavaコードは、独自の目的を持って、異なるデータ領域の数のために管理される、ということを知っています。

仮想マシンプロセスの立ち上げと地域のいくつか存在し、一部の地域は、一方でスレッドを作成し、破壊し、開始と終了のユーザーに依存しています。以下のメモリ領域構造のJVMランタイムに記載されている「Java仮想マシン仕様(Java SEの8)」では:

この記事では、ここでは詳細に説明していないされていない各エリアの機能に焦点を当てています。ここでは簡単な言及いくつかのポイントは、特別な注意が必要です。

1、これらは、Java仮想マシン仕様は、異なる仮想マシンの実装は異なりますが、一般的な仕様に準拠しています。

2、メソッド領域は、概念上の領域を除いて、仕様で定義されており、それが持っているべき機能説明しました。それは最終的にこの領域にあるべき場所しかし、それは指定されていません。だから、別の仮想マシンのために、それは自由度です。

図3に示すように、方法の異なるロケーションエリア異なるバージョン、上記画像は、論理領域に分割されて、物理領域は絶対的な意味ではありません。ヒープ領域でのJDKの方法のいくつかのバージョンが実際に実装されているため。

4、様々な用途にリテラルシンボルを記憶し、生成されたコンパイルのために実行時定数プール。しかし、Java言語はコンパイル時にのみ一定に発生させることができる必要はありません。たとえば、実行時に、String.internはプールに新しい定数になります。

図5は、外部上記JVMランタイム・メモリに加えて、利用可能なメモリの領域、すなわち、ダイレクトメモリがあります。Java仮想マシンの仕様では、このメモリ領域を定義していないので、彼はJVMを管理していないネイティブメソッドライブラリを使用すると、ヒープメモリ領域外に直接適用されます。

6、ヒープ及びスタックデータパーティショニングは、ホットスポットのJITとして、絶対的なものではないオブジェクトの割り当てのために最適化された適切な操作を行います。

上記のように、Java仮想マシン仕様で定義された要約、JVMのメモリ構造を、可能にします。これは、JVMによって管理されるJavaプログラムで、異なるデータ領域を実行するプロセスについて説明します。各領域は、独自の特定の機能を持っています。

Javaのメモリモデル

JavaのJavaのメモリモデルの外観とメモリ構造(JVMのメモリ構造)同様に、多くの人が誤っても、多くの場合、非Aなどとしてインタビュープロセスにつながった同じ事の子供、だと思います。

前方のJVMメモリ構造の図では、我々が見ることができるJavaヒープおよびメソッド領域は、データ領域の複数のスレッドによって共有される領域という。つまり、操作複数のスレッドは、スタック領域または方法に格納された同一のデータであってもよいです。これは、私たちはしばしば言うことである「Javaスレッドは、共有メモリを介して通信する間。」

Javaのメモリモデルが翻訳英語Javaのメモリモデル(JMM)に基づいています。JVMのメモリ構造は本物と同じであるとして実際には、JMMはありません。彼はただ抽象的な概念でした。JSR-133:Javaのメモリモデルとスレッド仕様はJMMがマルチスレッドと関連して、説明し、彼は、スレッドが別のスレッドの共有変数への書き込みを行う際に表示される定義するルールのセットまたは仕様を記載しましたA。

だから、単純な結論はJMM、共有メモリ通信の結果が、通信プロセス中などの視認性、原子配列、一連の問題があるだろう、共有メモリを介したJavaマルチスレッド通信の間でありますモデルは、マルチスレッド通信を中心に構築され、そして関連するプロパティの一連れます。JMMは、文法のセットを定義し、構文はJava言語に投影されている同期され、他のキーワード、揮発性。

JMMにおいて、我々は、並行プログラミングにメインメモリと呼ばれる複数のスレッド、複数のスレッド間のメモリ通信は自身のローカルメモリを維持共有(これは抽象化である)、データをメインメモリに格納されていますデータコピー。JMM主は、ローカルメモリとメインメモリとの間のデータ交換を制御します。

Javaでは、JMMはJMM、Javaの並行プログラミングは多くの問題を避けるためにこそそれは、非常に重要な概念です。ここではJavaのメモリモデルは、より詳細な紹介を行うことはありませんが、私は多くの友人がを参照することができます知っていると思い、「芸術のJava並行プログラミング。」

Javaのオブジェクトモデル

Javaはオブジェクト指向言語は、JVMに格納されたJavaオブジェクトは、特定の構造です。そして、これは、独自のJavaオブジェクト・ストレージ・モデルでJavaオブジェクトモデルと呼ばれます。

HotSpot仮想マシン、OOP-クラースモデルを設計しました。OOP(通常のオブジェクトポインタ)共通オブジェクト・ポインタを参照し、クラース・オブジェクト・インスタンス記載された特定のタイプのために。

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

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

总结

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

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

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

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

关于这三部分内容,本文并未分别展开,因为涉及到的知识点实在太多,如果读者感兴趣,可以自行学习。后面也会发文介绍这些内容,敬请期待。

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

おすすめ

転載: www.cnblogs.com/wangdaijun/p/11461255.html