Javaのインタビューの質問(3) - JVM

JVMのメモリ構造。


JVM主構造:ヒープ、スタック、方法エリア、プログラムカウンタ、永久的に生成)()の代替を使用して、8員スペースをjdk。
ヒープメモリは、若い世代と旧世代に分かれています。
若い世代は、サバイバーとToサバイバーから、三つの部分、エデンから成り、3つのデフォルトの配分比率は8:1:1。
データ領域の方法は、主にクラス情報、定数、静的変数等を記憶します。
スタックは、各Javaスレッドを作成してスタックに対応し、Java仮想マシン・スタックとネイティブメソッドスタックに分割され、
メソッドへの各呼び出しはスタックへの人々のスタックフレームとプットの圧力を作成し、スタックフレームは、ストアデータとメソッドのプロセスの一部に使用されていますデータ構造の結果、
スタックにスタックからプロセスに最終的手順、スタックフレーム対応に返された結果から、各メソッド呼び出し。
ネイティブメソッドスタックは主にネイティブメソッドを呼び出すために使用されています。
プログラムカウンタ(プログラムカウンタレジスタ)、メモリアドレスは、現在の実行スレッドの命令をバイトコードの仮想マシンを保持し、より小さなメモリ領域JVMです。
地区方法、ヒープ:すべてのスレッドがメモリデータ領域を共有しています。仮想マシンのスタック、ネイティブメソッドスタックとプログラムカウンタは、スレッドプライベートです。


作業プロセス、方法、ネイティブメソッドスタックおよびスタックのJVMスタック方法が違いは何ですか。


各スレッドはそれ自身のスタックを有し、スタックは、実行の各メソッドのスタックフレームを含みます。
スタックは第一アウト(LIFO)データ構造の最後で、この方法は、現在スタックの最上部で行わ。
メソッドが呼び出されるたびに、新しいスタックフレームが作成され、スタックの最上部にスタックに保存されます。
この方法は、返しまたはキャッチされない例外をスローするとき、それはスタックフレームをポップします。
プッシュとスタックのスタック・フレームに加えて、スタックを直接操作することはできません。
スタックフレームは、ヒープ上に割り当てることができ、かつ連続したメモリを必要としません。


オブジェクトを関連付ける方法JVMのスタックとヒープ参照。


ヒープは、配列またはオブジェクトを生成した後に、あなたはまた、特別なスタック変数を定義することができ
、この変数スタック・アレイまたはオブジェクトの値は、ヒープメモリの先頭アドレスに等しくなるように、スタック変数となりました配列またはオブジェクト参照変数。
A Javaヒープランタイムデータ領域、クラス(目標分配スペース。ある
新しい、NEWARRAY、anewarray multianewarrayおよび他の命令、プログラムコードを確立することにより、これらのオブジェクトは、それらを明示的に解放する必要はありません。
ヒープガベージコレクションが担当しますヒープは、動的に割り当てられたメモリサイズの利点である、生存率は、事前にコンパイラに指示する必要はありません
メモリの動的割り当て、Javaのガベージコレクタが自動的にそれはもはや実行時に使用されているこれらのデータを離れて撮影するので。
しかし、欠点は、は、実行時にメモリアクセス速度の遅い動的割り当てのためです。 

スタック利点は、レジスタの後、スタックデータを共有することができ、アクセス速度が速い原子炉よりもあるということです。
しかし、欠点は、スタックサイズと生存率のデータは、柔軟性の欠如を決定しなければならないがあるということです。
メインスタックストア変数のいくつかの基本的なタイプ(、int型、ショート、ロング、バイト、フロート、ダブル、ブール値、文字) 、およびオブジェクトハンドル。 

https://www.cnblogs.com/langren1992/p/4738391.html
https://www.jianshu.com/p/ac162726d7de

あなたは、エスケープ分析技術を見つけることができます。


この方法は、エスケープ:オブジェクトがメソッドで定義されている場合、方法は、コールパラメータの他の方法として渡されるように、外部から参照することができるからです。
スレッドエスケープ:オブジェクトのメソッドで定義されている場合、外部のスレッドが他のスレッドでアクセスクラス変数またはインスタンス変数に、例えば、アクセスすることができます。
スタックに割り当て:オブジェクトは実現しなかったエスケープ、スタックに割り当てられたスペースにあります。(ヒープ内の一般オブジェクト割り当てスペース)
異なる(ヒープまたはスタック)メモリ空間に割り当てられ、JVMをエスケープするためにオブジェクトに基づいて発生されます。1を逃がすことが起こるならば、それはヒープに割り当てられます。

https://blog.csdn.net/qq_32575047/article/details/81214178
https://blog.csdn.net/somnusrush/article/details/76027122
https://www.jianshu.com/p/3ecc626ce304


GCの一般的なアルゴリズムは、2の世界を停止しているCMSとG1のガベージコレクションプロセス、CMSの様々な段階では、CMSは破片、G1の優位性を生成しません。
いくつかのアルゴリズムの差は、旧世代の回復に反映されています。

PS
マーク・コピー(STP)
若い世代のガベージアルゴリズム
マーク-コピー別のエリアにエデン面積とS Surviorエリアをコピーすると、生存マークの数。

CMS(現在のマークスイープ)
旧世代のガベージアルゴリズム
の初期マーク(STP):最初のマーク、ルートノードから開始、停止する最初のノードを見つける
並行マーク(ないSTPを):並行マーク、ノードの最初のマークから始まります非空のノードラベル
同時-予備洗浄(ないSTP):前クリーニングプロセス。
発言(STP):同時マークは、すべてのオブジェクトをマークしていない完全に、STPはないので発言する必要が
コンカレントスイープ(ないSTPを):すべてではないタグ付けは、クリーンアップ
(ないSTP)の同時リセットを:内部データをリセット構造の
CMSは、メモリの断片化が生成されます。
ガベージコレクションは、完了したことをコレクタアルゴリズム、メモリの断片化、大量のこの手段- CMSは、「スイープマーク」に基づいており
、大きなオブジェクトが割り当てるための十分な連続スペースでない場合には、事前に全GCをトリガする必要があり、増加のSTP時間。

G1の
ごみまずアルゴリズム:
初期のMark(STP):CMSと同様の動作を同時にマイナーGCです。
ルート領域のスキャン(STP):参照は、古い時代に記された初期走査領域を生き残る、および参照されるオブジェクトをマークします。(マイナーGC共通操作)
同時マーク(ないSTP):同時マーク、初期マーク開始ノードからは、非ヌル・ノード標識
後期クリーンアップの使用を容易にするために、各ターゲット領域の生存率を計算する
発言(STPを)ので並行マークは、すべてのオブジェクトをマークしていない完全に、STPではありません再マークする必要があります
クリーンアップ(ないSTP):クリアはフリーリストに追加リージョンを(オブジェクトを生存しなかった)、空にします。地域のリサイクルは、単にあなたがSTPに必要のない、オブジェクトではありませんでした。
CMSとG1との差:
G1変化メモリ構成、メモリ空間は連続的ではない、
しかし(E(エデン)、S(サバイバーに一つの領域 )、O(旧)、H(作品Humongous))。
次に、変更備考位相マーカアルゴリズム、G1アルゴリズムはSATB(スナップショット・アット・ザ・ある初め)。
デフォルトのガベージコレクタとして11 G1ををjdk。
長所:
G1は、ガベージコレクタのメモリの統合プロセスでメモリの断片化の多くを生成しません。
G1のストップザ・ワールド(STW)より制御、G1は、ユーザが所望の滞留時間を指定することができ、滞留時間に予測機構を追加します。

https://tech.meituan.com/g1.html


アルゴリズムを整理する利点と欠点マークとタグの明確な理解。

マーク-スイープアルゴリズム(マーク・スイープ)
  「マーク-スイープ」アルゴリズムは、その名前が示すように、アルゴリズムは「マーク」と二段階で「クリア」に分かれています。
すべてのオブジェクトが団結の完了をマーキングした後、回復する必要がある最初のマークすべてのオブジェクトは的外れ回収されます。
その後のコレクションアルゴリズムは、この考えに基づいて、得られたその欠点に改善を行うされているので、それは、最も基本的なコレクションアルゴリズムである理由。
それは二つの主な欠点があります。
(1)効率性:効率性マーキングおよび除去プロセスは高くありません。
(2)スペースの問題:あまりにも多くの原因となる可能性がクリアスペースデブリ後のメモリの断片化不連続マークを大量に生成されます、
あまりにも世界を停止し、大きな破片オブジェクトが事前にトリガーGCに持っていた十分な連続したメモリを割り当てることができない原因になります。
マーク- (マーク・コンパクト)を終え
   コレクションアルゴリズムをコピーすると、高い目標の生存率でより多くのコピー操作を実行します、効率が低くなります。
あなたは宇宙の50%を無駄にしたくない場合は、より多くのポイントに、あなたは、追加のスペースに割り当てられた保証を持っている必要があり
、すべてのオブジェクトによって使用されるメモリに応じて、極端な場合には100%生存している、それは古い一般的にはこれを直接選択することができないのですアルゴリズム。    
(マーク・コンパクト)アルゴリズム、 -古い時代の特徴によれば、「仕上げマーク」の別の種類があることが示唆された
タグ付けプロセスは、「マーク-スイープ」まだあるアルゴリズムは同じですが、その後の工程は、直接クリーンアップするオブジェクトを再利用していない、
しかし、その後、直接末端境界外のメモリを一掃、すべての生存オブジェクトが最後に移動されてみましょう。

https://blog.csdn.net/wuzhiwei549/article/details/80563134

エデン遺族地区の割合は、なぜこの比率、エデン生存者の作業プロセスです。

デフォルトの比率は8:1:1。
若い世代のガベージコレクションのアルゴリズムはコピーアルゴリズムを使用して、若い世代のオブジェクトは、基本的には死(80%)に向けて、生の夜なので。
地域で生まれエデンの若い世代は、GCと一緒に、サバイバー、1歳から地区へのエデン地区をコピーします。
ここでも、回復コピーして、ゾーンへのサバイバーへサバイバーゾーンからエデン。古い世代に、8歳の年齢を超えます。

https://www.jianshu.com/p/534ab3c8335f
 

JVMは、オブジェクトがルートのいくつかの種類があると見ることができGC、あるかどうかを確認する方法。

GCのルーツ。パスは、オブジェクトから、あるいはルート・オブジェクトからのルートオブジェクトに達していない場合は到達不能であるオブジェクトへの参照とすることができません。
GC根:
    対象物1仮想マシン(JVM)参照スタック 
        の各方法を実行する、JVMは、対応するスタックフレームを作成し、(スタックフレームは、オペランドスタック、ローカル変数テーブルを含む、頻繁に実行引用プール)
        参照のメソッド内で使用されるすべてのオブジェクトを含むスタックフレームは、後者の方法の実装は、スタックフレームが仮想スタックマシンからポップされる(もちろん、データ・ベースの他のタイプが存在する)
    クラスの静的プロパティ2ゾーンの方法オブジェクト参照は、
    3を参照しているオブジェクトの定常領域(最終的な一定値)方法
    4ネイティブメソッドスタックJNI参照オブジェクト

https://blog.csdn.net/u012941811/article/details/52427372

それらが実行する方法についての強弱ファントム参照のGC操作の違い。

強力な引用:
ガベージコレクタはそれを取り戻すことはありません
十分なメモリ空間がある場合には、Java仮想マシンではなく、エラーをOutOfMemoryErrorがスローだろう、プログラムの異常終了、それはメモリ不足の問題を解決するための強い参照を持っているランダムオブジェクトによって回復することはありません。
ソフト引用:
メモリ空間が不足している場合、それはこれらのオブジェクトのメモリを再利用しますが
、メモリに敏感なキャッシュを実装するために使用することができます。参照ソフト参照オブジェクトがガベージである場合、Java仮想マシンは、関連するキューを引用し、このソフト参照に追加されます。
弱参照:
より短いライフサイクルに関係なく、現在のメモリ空間の十分かではなく、そのメモリを解放します。
参照ソフト参照オブジェクトがガベージである場合、Java仮想マシンは、関連するキューを引用し、このソフト参照に追加されます。
偽の引用:
ファントム参照オブジェクトは、ライフサイクルを決定するものではありません、それはいつでもガベージコレクションである可能性が高いです。
そして、参照は、組み合わせて使用される仮想キュー(ReferenceQueue)を参照する必要があります。

https://blog.csdn.net/panyongcsd/article/details/46605613

かどうかのJavaは、直接GCメモリーすることができます。

NIOバッファJVMメモリが物理メモリシステムクラス--DirectBufferに直接アクセスすることなく使用することができる提供します。
 ByteBufferの、ヒープ上に割り当てられたByteBuffer異なるが、通常、普通のByteBuffer依然としてJVMメモリからDirectBufferクラス継承は、
 その最大メモリは、最大ヒープメモリによって制限され、そしてDirectBufferは、物理メモリに直接割り当てられ、ヒープスペースを占有しない、そのあなたは、オペレーティングシステムによって制限される最大メモリを申請することができます。
(注:DirectBufferない本当にallocateMemoryは、()の危険を呼び出すことによって割り当てられたメモリに最終的にあるOSのアプリケーション割り当てメモリ、に、しかし、JVMサイズにダイレクトメモリも制限され、利用可能-XX:。MaxDirectMemorySize = 1M設定、を適用することができますJVMのガベージコレクションは、メモリ管理の一部ではない。)
JVMヒープメモリ割り当て(割り当て)、より良好なダイレクト・メモリ・アロケーション(allocateDirect)アクセス性能が、より遅い分布と比較しました。

https://www.cnblogs.com/z-sm/p/6235157.html?utm_source=itdadao&utm_medium=referral
http://www.importnew.com/21998.html

Javaのクラスのロード処理。

ロードリンク(検証、準備、分析)、初期化。
負荷:クラスローダによって、さまざまなソースからのファイルのバイトコードクラスがメモリにロードされました。
    バイトコードのソース。リモートネットワーク、リアルタイムのコンパイラおよび動的プロキシから、の.classファイルのjarパッケージからローカルパス.classファイルでコンパイルなどのソースから生成一般的な負荷
    クラスローダ。クラスローダは、一般的に、プロモーター、拡張クラスローダー、クラスローダ・アプリケーション、およびカスタム・ユーザー・クラスローダーが含まれます。
検証:主に、仮想マシンの仕様に合わせてロードされたバイトの入力ストリームを確保するためにセキュリティエラーをもたらすことはありません。    
調製:メインクラス変数(ノートではなく、インスタンス変数)のためにメモリを割り当てることで、初期値が与えられます。Java仮想マシンは、変数のデフォルトのタイプに応じて、初期値です。
分析:直接参照を置き換えるプロセスへのシンボリック参照の定数プール。
    シンボル参照。すなわち文字列が、文字列は、方法の固有の識別番号、変数、関連情報のクラスを与えることができます。
    直接参照。これは、メモリアドレスと理解、またはオフセットすることができます。このようなクラスの方法として、変数クラスへの直接参照は、メソッド領域へのポインタであり、
    インスタンスメソッドへの直接参照は、インスタンス変数は、インスタンス変数のオフセット位置の開始以来、ヘッド・ポインタの一例である
初期化:メインクラス変数の初期化は、プロセスは、クラスコンストラクタで行われます。静的または変数の初期化ステートメントの変更。

https://blog.csdn.net/ln152315/article/details/79223441
https://www.cnblogs.com/xiaoxian1369/p/5498817.html

 

両親委任プロセスモデルと利点。

親委譲モデル実装コードは、()メソッドはjava.lang.ClassLoaderのloadClassに集中している:  
クラスが既にローディングを通してロードされている要求する最初のかどうかをチェックする、  
オーバーロードされていない場合:  
再帰呼び出し親クラスローダのloadClass()を;  
親クラスローダは、クラスがロードされて起動し、使用後は空であり、  
親クラスローダとクラスローダは、関数が自分自身を呼び出すロード、ロード要求を開始することができない場合。
利点;
Javaクラスのクラスローダと一緒には、様々な負荷環境でそのロード順序を確保するための優先順位の階層関係を持っています。  
、運転の安全性を確保するために、信頼できないクラスを防ぐために、信頼できるクラスを果たしました。

https://blog.csdn.net/inspiredbh/article/details/74889654
https://blog.csdn.net/qq_38182963/article/details/78660779

 

従来のJVMのチューニングパラメータ。


トレーストレース:
簡単な情報は、GCを印刷1.:
-verbose:GC
-XX:+ PrintGC
2.プリントGC :(生産の詳細は使用しません)
-XX:+ PrintGCDetailsは
:ログGCの場所を指定します3.
-Xloggc:ログ/ gc.log
前記クラスローダ情報:
-XX:+ TraceClassLoading
5ヒープメモリが提供される:
-Xms1g -Xmx1G
6由来パスOOM:
-XX:D = HeapDumpPathを:/a.dump
7.初期ヒープサイズ
-Xms
8。最大ヒープサイズ
-Xmx


ダンプファイルの解析。


jmapの-dump:ファイル=ファイル名の.dump [PID]
JDKは、VisualVMのが来ます


Javaは(なし)アクティブなトリガGCの方法がありません。


System.gc();
//以下、同等の両方
Runtime.getRuntime()GC();.
ちょうど通知GC、および実行されません。


メモリリークおよびメモリのオーバーフローの間の差との接続

再発性メモリリーク:
コードメモリリークを複数回実行する、実行するたびに、メモリリークにつながります。
時折メモリリーク:
コードメモリリークのみ発生する特定の環境またはプロセス動作の下で起こります。散発的な再発と対向しています。
特定の環境では、散発的には、おそらくそれは、多くの場合で作られてしまいます。だから、メモリリークを検出するためのテスト環境と試験方法が不可欠です。
ワンタイムメモリリーク:リークがコード内で発生したメモリは一度だけ実行、またはアルゴリズムの欠陥によるものであろう、常にちょうど原因とメモリリークが発生します。
例えば、コンストラクタクラスのメモリに割り当てられますが、メモリリークが一度だけ行われるように、メモリデストラクタを解放しませんでした。
暗黙のメモリリーク:運転中にノンストッププログラムのメモリを割り当て、だけ空きメモリの終わりまで。
厳密に言えば、メモリリークは、すべてのアプリケーションの最終的なプログラムメモリの解放ので、ここでは発生しませんでした。
メモリのないタイムリーなリリースでは、最終的にメモリシステムが不足する可能性があります。そこで、我々は、暗黙的なメモリリークのメモリリークのこのタイプを呼び出します。
メモリオーバーフロー原因と解決策:

:メモリの理由から 
、このようなデータベースから取ら過度の時間として、大きすぎるデータ量がメモリにロードされ、 
コレクションクラスは、オブジェクトへの参照を持つJVMように、使用後に空になっていない、リサイクルすることができない、 
デッドサイクル又はサイクル存在コード生成あまりにも多くの重複オブジェクトの実体; 
BUGで使用されるサードパーティ製のソフトウェア、 
メモリ設定が小さすぎる起動パラメータ値
メモリオーバーフロー液を: 
直接メモリを増やし、JVMの起動パラメータを変更します。(-Xms、-Xmxパラメータが追加することを忘れてはなりません。)
その他の異常やエラーがエラーの前にあるかどうか「のOutOfMemory」を参照し、エラーログを確認してください。
メモリのオーバーフローの可能性のある領域を特定するためのコードのウォークスルーと分析。


https://blog.csdn.net/ruiruihahaha/article/details/70270574

公開された115元の記事 ウォン称賛58 ビュー23万+

おすすめ

転載: blog.csdn.net/Angry_Mills/article/details/82107305