6つの一般的な方向についての知識、JVMの概要合計:メモリモデル、クラスローディング機構は、GCのガベージコレクションは、コンテンツに、より焦点です。パフォーマンスチューニングセクションの実用化に重点を置い、焦点を当てた、実用的な能力。コンパイラの最適化と理論的根拠を重視の実行モード部、主に知識のポイントを獲得します。
次のように各セクションは1>メモリモデル部:データが格納されているアクションのプログラムカウンタ、メソッド領域、ヒープ、スタック、ネイティブメソッドスタックを、。
2>クラスローダ部:両親は、ローディング機構及び各クラスタイプをロードする共通のクラスローダを委任。
3> GCの一部:世代の思考と回復の基礎、ならびに異なるガベージコレクションアルゴリズムのアイデア、適切なシーン。
4>チューニングセクション:一般的なJVMパラメータ最適化の役割は、一般的なJVM上の情報に基づいてパラメータを調整問題分析ツールの種類、および使用方法を分析することができます。
5>実行モード]セクション:混合モードの解釈、コンパイル、長所と短所、提供コンパイラ技術のjava7の階層的な理解。JITコンパイラは、リアルタイムの技術を知っている必要があるとOSRはスタックに交換され、シーンC1を知って、C2コンパイラより急進最適化されたサーバモード、のためにどのC2のため。新技術でJavaが提供するグラールコンパイラjava10の実装を見つけることができます。
6>パートコンパイラの最適化:コンパイラフロントエンドのjavacのコンパイルプロセス、AST抽象構文木、コンパイラの最適化と操作の最適化。一般的なコンパイラの最適化技術、方法、エスケープ分析、スタック分布、排泄の同期との共通部分式の除去、。私は、コードコンパイラを書くために、このフレンドリーを理解しています。
JVMのコンテンツが比較的集中しているが、推奨は強化に焦点を当てる前に知識のための高い要件は、インタビューの深さを把握します。
JVMのメモリ関連のテストサイト
1.詳細な-jvmメモリモデル
JVMのメモリ・モデルは、主に5つの部分を含む、ランタイムデータ領域を指します。
また、呼び出されたメソッドがスタックスタック、スレッドローカル変数テーブルを格納すると同時にスタック・フレームにおける各方法の実装で作成されたスレッドにプライベート操作情報スタック、動的リンク、方法の輸出です。実行スタック法、スタックメソッドが返すの実装を呼び出すとき。
ネイティブメソッドスタックと同様のスタック、また、Javaスタックを使用して実行する方法以外は、ときにスレッド実行方法情報を格納するために使用され、そしてネイティブメソッドがネイティブメソッドスタックを使用して実行します。
プログラムカウンタは、各スレッドが独立したワークカウンタを有し、バイトコード実行スレッドの現在の位置を保持します。Javaメソッドの実装のためのプログラムカウンタサービス、ネイティブメソッドの実行、プログラムカウンタは空です。
スタック、ネイティブメソッドスタック、プログラムカウンタは、これらの3つの部分がスレッド排他的です。
ヒープは、JVMのメモリ管理の最大部分であり、すべてのスレッドにより共有ヒープは、目的は、ほぼすべてのオブジェクトインスタンスがここで割り当てられ、オブジェクトのインスタンスを格納することです。ヒープメモリ空間が利用できない場合は、OOM例外がスローされます。対象の生存期間、ヒープ管理のためのJVM世代のメモリに応じて、管理は、ガベージコレクタによって回収されるオブジェクト。
各スレッドは、非ヒープ領域として知られている方法エリア共有メモリ領域です。クラス情報は、仮想マシンは、定数、静的変数は、タイムコンパイラはコードやその他のデータをコンパイルするために、ロードされている格納するために使用されます
1.8メタスペース及び方法地域の永続的なjdk1.7世代の一種が達成されています。
2点の結果を知るために、この知識に関連したインタビューの質問に答えるとき:1は、他のスレッドを共有し、独占的にある各部分の機能は、あります。
メモリの2.詳細-jmm可視
JavaのメモリモデルであるJMM、今述べたメモリモデルのJVMは、2つの異なるものです、主な目的は、プログラム中の変数を定義しJMMアクセスルールにある示すように、すべての共有変数が共有メインメモリに格納されています。各スレッドは、独自のワーキングメモリは、ワーキングメモリは、変数のメインメモリコピーに格納され、このような操作を読み書きするスレッドのような変数は、彼らのワーキングメモリで実行されなければならないしているが、直接メモリ内の主な変数を読み書きすることはできません。
そのような共有変数割り当てのスレッド後、マルチスレッドデータ交換は、スレッドBによってこの値を読み取ることと、変数がメモリ内の独自の作業領域に変更を変更され、Bのみから見えません作業領域をB、メインメモリにライトバックし、さらに操作を実行するために自分の仕事領域にメインメモリから読み出されます。命令並べ替えがあるので、書き込み - 読み順が崩壊する可能性があります。
したがって、JMMはアトミック、可視性、注文保証を提供する必要があります。
3.詳細-jmm保証
整然とした次の主要なJMM保証アトミック、可視性を導入する方法。
-
JMMは読み、longとdouble以外の基礎となるデータ・タイプがアトミックであることを確認するための操作を記述します。また、キーワードシンクロナイズドもアトミック性の保証を提供することができます。シンクロナイズドアトミック性を確保monitorenterとmonitorexit命令の2つのJavaバイトコードで進んでいます。
-
同期して保証JMMの可視性は、他の一つは揮発性です。揮発性変数の割り当ては、異なるスレッドが常に変数の最新の値を見ることができることを確認するために戻って、メインメモリからリロードされる変数を読み取るように強制メインメモリリフレッシュ同期に強制されます。
-
主に揮発性と事前発生主義の一連の、秩序を確保するためにJMM。別の効果は、秩序の読み取りを確保し、変数を記述するように、揮発性の命令の並べ替えを防ぐためです。
事前発生原理、すなわち、それは意味論的スレッドの直列化を確認する必要があり、そのようなプログラムのための原理とルールのセットを含む、ロックルール、即ち、同一のロックを解錠する再ロックする前に発生しなければならない。また含む事前発生原理推移は、スレッドの開始、一時停止、ルールを終了します。
ます。https://juejin.im/post/5cef945e6fb9a07ef1616765で再現