JVMのメモリ構造を聞いてとても難しいことができ、顔の質問を考えたことはありませんか?

私のブログでは、JVMのメモリ構造の前に導入された多くの記事があり、私は多くの友人が、知識のこの部分は一定の理解を持っている私の記事の詳細を参照すると信じています。

だから、次の質問に答えてみてください。

1、JVMのメモリ管理構造とは何ですか?
実行時に2、異なる仮想マシンのメモリの違いは何であるかを実現するには?
3、ランタイムデータ領域は、領域は、スレッドによって共有されていますか?何が排他的ですか?
4、JVMランタイムメモリに加えて、どのような領域を使用することができますか?
5.スタックとヒープの違いは何ですか?
図6に示すように、アレイ内のJavaヒープまたはスタック上に格納されていますか?
どのように多くの方法で作成した7、Javaオブジェクト?
8、Javaで作成されたプロセスオブジェクトがどのようにのようなものでしょうか?
一定では9、Javaオブジェクトをヒープメモリに割り当てられましたか?
ヒープとスタックダンプファイルを取得する方法10、?

あなたがすべて正確に答えることができれば10の以上の質問は、それはあなたが本当にJVMのメモリ構造とメモリ割り当ての関連知識を理解し、知識を理解していないものがあれば、この記事はあなたを助けることを意味しよくある質問。

JVMのメモリ管理構造とは何ですか?

Java仮想マシンのメモリ部門のJavaプログラムの実行中に、彼はいくつかの異なるデータ領域を管理します。「Java仮想マシン仕様は、」JVMの管理が必要とするメモリは、いくつかのランタイム領域について含まれて提供されます。

メインレジスタは、PC(プログラムカウンタ)、Java仮想マシン・スタック、ネイティブメソッドスタック、Javaヒープ、メソッド領域と実行時定数プールが含まれています。

様々な領域は、私は信じていないこの資料に記載された各領域の役割に異なる効果を持っています。

しかし、それは上記の唯一の論理的ゾーニング領域があることに留意すべきであるの実現、または同じ仮想マシンであっても異なるバージョンで異なる仮想マシンのベンダーがいないと同じになるように、地域のためのいくつかの制限は、比較的緩いです。

異なる仮想マシン実行時のメモリの実現の違いは何ですか?

先に述べたようにメモリ領域が異なる仮想マシン上で異なる定義JVMランタイムの「Java仮想マシン仕様を、」必要、など多くの分野で、管理領域の仕様は最もリベラル、仕様です以下の記述のこの部分では:

メソッド領域は論理的にヒープの一部ですが、シンプルな仮想マシンの実装は、地域でガベージコレクションと圧縮を実装しないことを選択するかもしれないが、仮想マシンは、作成が供給されてメソッドエリア。仕様のこのバージョンは、実装領域コードのコンパイルとメモリ位置管理戦略に限定されるものではありません。需要を動的に実行するプログラムを拡張することができるように容量領域の方法は、固定することができ、そして必要でない場合、あまりにも多くのスペースを自己収縮します。メソッドエリア実メモリの宇宙ステーションでは不連続であってもよいです。

この規定は、仮想マシンが多くの自由をベンダに言うことができます。

仮想マシン領域の位置の指定方法が明示的に、仮想マシン(従来のJava 8)で実装最も有名なHotSoptを達成するために必要とされていない、唯一の方法エリアは、物理的にスタックから独立して存在せず、論理的に別個の領域でありますそれは永続的な世代にあります。だから、この時間領域はまた、ゴミをリサイクルすることができる方法です。

練習は、JVMは、オブジェクトの簡単な文の多くがあることを証明している、オブジェクトのいくつかの比較的長いライフサイクルがあります。彼らは世代コレクションアルゴリズムを使用して、さまざまな収集戦略を使用するためには、それほどのHotSpot仮想マシンは、年齢にヒープ五分位新生代歳と永久世代によって異なります。

Javaの8では、代わってのHotSpot仮想マシンの永続的な除去、メモリの局所的な使用は、メタデータ情報と通話タイプを格納する:要素空間(メタスペース)

実行時の領域はスレッドで共有されるデータ領域を?何が排他的ですか?

JVMの実行時メモリ領域では、PCレジスタ、仮想マシン・スタックとネイティブメソッドは、スレッドが排他的であるスタック。

Javaヒープ、メソッド領域は、スレッドで共有されます。しかし、それは実際にはJavaヒープは、各スレッドが別々の割り当てられていない、ということは注目に値するTLABスペースを共有スレッドを使用している場合、このスペースは、排他的なの配分のスレッドです。

JVMランタイムメモリに加えて、どのような領域を使用することができますか?

ダイレクトメモリ - 私たちは先に説明した仮想マシンの実行時のデータ領域に加えて、いくつかのメモリはまた、頻繁に、彼はランタイムデータ領域の一部ではない、またそれは仕様で定義されたJava仮想マシンのメモリ領域、彼はある使用されて残っています。

ダイレクトメモリ割り当てのJavaヒープサイズは制限されないが、彼は、全サーバのメモリの影響を受けます。

導入NIO JDK 1.4、チャンネルバッファに基づいてI / Oモードの導入で、彼はその後、JavaオブジェクトがDirectByteBufferこのメモリとしてヒープに格納し、割り当てられたヒープメモリの外に直接ネイティブ機能を使用することができますアプリケーションが動作します。

スタックとヒープの違いは何ですか?

ヒープ及びスタック(VMスタック)スレッドが排他的であり、メモリの2つの完全に異なる領域であり、スレッドが共有され、両者の最大の違いは、異なるコンテンツに格納されます。

主記憶ヒープ・オブジェクト・インスタンス。
基本データ型、オブジェクト参照の主記憶装置内のスタック(ローカル変数テーブル)。

配列内のJavaヒープまたはスタック上に保存されていますか?

Javaでは、アレイは、オブジェクトであるため、どのようにオブジェクトがメモリ内のアレイにも同様に適用可能に保持されています。

したがって、アレイの一例は、ヒープに格納され、参照の配列は、スタックに格納されています。

どのように多くの方法で作成されたJavaオブジェクト?

Javaはオブジェクトを作成するには多くの方法がありますが、最も簡単な方法は、新しいキーワードを使用することです。

User user = new User();
复制代码

また、あなたは、リフレクションを使用してオブジェクトを作成することができます。

User user = User.class.newInstance();
复制代码

クラスは、またはのnewInstanceコンストラクタを使用します。

Constructor<User> constructor = User.class.getConstructor();
User user = constructor.newInstance();
复制代码

方法はまた、クローニングおよびデシリアライゼーションの方法に加えて使用することができる、これらの2つの方法が一般的に使用されておらず、コードはここに示していない、より複雑であり、自己の利益を理解することができます。

プロセスで作成されたJavaオブジェクトは、どのようにでしょうか?

次のように大別して、プレーンなJavaオブジェクトを作成するには:

1、クラス参照のシンボルを見つけるために、新しい仮想命令、定数プールへの機会。
2、シンボリック参照が表すクラスは、ロードされ解析され、初期化されているかどうかをチェックします。
図3に示すように、仮想マシンのメモリをオブジェクトに割り当てられました。
4、ゼロ値に初期化すべてに割り当てられた仮想マシンのメモリ空間。
5、必要な設定をターゲットにする仮想マシン。
6、実装方法は、メンバ変数が初期化されます。

特定のJavaオブジェクトは、ヒープメモリに割り当てられましたか?

我々は以前、Javaヒープは、主にコンパイルJITの開発に、しかし、オブジェクトのインスタンスを保存すると、エスケープ解析技術が成熟する、スタック上の分布を、スカラー交換用の最適化技術は、すべてのオブジェクトがあり、いくつかの微妙な変化をもたらすだろうヒープに割り当てられているが、徐々に少なく、「絶対に」となっています。

実際には、コンパイル時に、JITはコードの最適化の多くを行います。目的は、エスケープ解析と呼ばれる重要な技術であるメモリ割り当てヒープ圧力の最適化、の一部を削減することです。

分析を通じてJITのエスケープは、いくつかのオブジェクトがメソッドをエスケープしていないことが判明した場合は、ヒープメモリの割り当ては、メモリの割り当てをスタックするように最適化され得ることが可能です。

ヒープとスタックダンプファイルを取得する方法10、?

Javaのダンプは、時にJava仮想マシンのスナップショットを実行します。ファイルの状態情報Java仮想マシンの実行を保存します。

これは、使用して、サーバー上で使用することができますjmapのを使用して、ヒープ・ダンプを取得するには、コマンドをjstackスレッドコールスタックダンプを取得するためのコマンドを。

おすすめ

転載: juejin.im/post/5d4789afe51d453b386a62ac