JVM問い合わせ

で再現狂った神の先生、ノートのみを使用

。1、JVMの位置
2、JVMのアーキテクチャ
図3に示すように、クラスローダ
4、親委譲機構
5、サンドボックスのセキュリティ機構
6、ネイティブ、PCレジスタ(プライベートスレッド)、メソッド領域
7、スタック:データ構造
8、 JVMの三種類
9、ヒープ
理由はOOM分析する10、JPofiler用ツール
11、GCガベージコレクタ
12、JMM

1、JVMの位置

2、JVMアーキテクチャ

3、クラスローダ

3.1仮想マシンは、ローダーが来ます

3.2。スタートクラス(ルート)ローダー

3.3。拡張クラスローダ

3.4。アプリケーションローダー

4、両親デリゲートメカニズム

クラスがロードされたクラスローダー、それが続きます

APPアプリケーションクラスローダA> EXTクラスローダを拡張>ルートルート・クラス・ローダ(最終実行)

あなたはクラスローダに従わない場合は、見つけることが前方に移動します(ルートクラスローダ - >拡張クラスローダ - >アプリケーションのクラスローダ)

アクション
より安全、同じ袋状の干渉を避けるために

5、サンドボックスセキュリティ・メカニズム

Javaコードは、仮想マシン(JVM)の特定の動作範囲内に定義され

典拠コントロールのセキュリティ上のリスクがあるかもしれないいくつかのリモコンコード

構図

バイトコード検証

クラスローダ

アクセスコントローラ

セキュリティマネージャ

セキュリティパッケージ

6、ネイティブ、PCレジスタ(プライベートスレッド)、メソッドエリア

6.1、ネイティブ

Javaのリーチの範囲を示す、nativeキーワードをもたらした人たちは、戻って、ネイティブメソッドスタックに根本的なC言語のライブラリを呼び出し、JNIインタフェースネイティブメソッドを呼び出します

JNI関数:最初に使用異なる融合Javaプログラミング言語を使用してJava拡張機能:! C、C ++

C、C ++横行は、足掛かりを得るしたいときに生まれJavaはC、C + +プログラムを呼び出す必要があります

ネイティブメソッドスタック、ネイティブの登録方法:それはマーキング地域に特別なメモリ領域を開きます

最終実行方法は、JNIライブラリをネイティブメソッドをロードすると

例-------「Javaのプリンタドライバプログラム、管理システムは、エンタープライズ・アプリケーションでは、比較的まれで把握することができます

6.2、レジスタ(スレッド・プライベート)

各銭チェンが持っている - プログラムカウンタを、スレッドがプライベートで、地域内のメソッドのバイトコードのメソッドへのポインタで、次のコマンド実行エンジンは、非常に小さなメモリ空間で読み、ほとんど無視できますカウントされません。

複数の実行スレッドは、障害が発生していないとき、それは意味します

6.3、メソッド領域

保存のもの

静的変形変数、最終(定数)、全てのクラスのクラス情報(コンストラクタ、インタフェース定義)、定数プール。

しかし、ヒープメモリのインスタンス変数の存在、および独立した方式エリア

定義

メソッド領域は、すべてのスレッド間で共有され、そのようなコンストラクタとしてすべてのフィールドとコードバイトの方法、ならびにいくつかの特別な方法は、インターフェースコードはまた、本明細書に定義されます。簡単に言えば、すべての定義されたメソッドに関するすべての情報は、この領域は共有スペースに属し、領域に格納されています。

図7に示すように、スタック:データ構造

物事を格納します。

  • 実施例8実質的ラージオブジェクト参照型+ +方法

進出後、LIFO(キュー:FIFO FIFO)

なぜ)(メインの実行、および終了前に

スタックメモリ、プログラムを実行しているの担当、ライフサイクルとスレッドの同期

スタックメモリの終わりをスレッドスタックに放出され、ガベージコレクションの問題は存在しません。

上のスレッドのスタックオーバーの終わりに一度
スタックフレーム:スタックの原則の実装

  • メソッドの各実装。スタックフレームの生成

----「にStackOverflowError ----」スタックメモリのオーバーフローのフルスタック

+ヒープ+スタック方式エリア:相互作用

8 3 JVM

8.1、SunのHotSpotの会社

8.2、BEA JRockitの

8.3、IBM J9VM

9、ヒープ

9.1の後、クラスローダがクラスファイルを読み込んで、一般的に何がヒープを配置します

クラス、メソッド、定数、変数〜、私たちのすべての実オブジェクト参照型を保存

9.2、ヒープは、JVMは、ヒープメモリ、ヒープメモリサイズを調整することができます

9.3、ヒープメモリはまた、3つの領域に分割されています

9.3.1新生領域(領域エデン)ヤング/新

クラス:地元や死の誕生と成長

エデンの園は、すべてのオブジェクトは、エデンの園でのエリアの新しい出ています

生存者の領域(0,1)

9.3.2、年金古い地区

真実:調査した後、オブジェクトの99%が、一時的なオブジェクトであります

9.3.3永続的なペルミ地方

それ自体が担持JDKクラスオブジェクトを格納するために使用される永久メモリのこの領域、。インターフェイスのメタデータは、ガベージコレクションは、この領域に存在しない、いくつかのJavaランタイム環境情報の種類や〜を保存します!閉じるVMの仮想メモリがこの地域をリリースしています

サードパーティのjarパッケージの多数を搭載した起動クラス、。あまりにも多くのアプリケーションのTomcatの展開、動的に生成されたクラスの反射の数が多いです。常にロードされています。メモリがいっぱいになるまで、OOMがあるでしょう

JDK1.6前に:永久世代は定数プールエリアの過程にある
jdk1.7:永久の世代が、ゆっくりと永続的な世代のヒープの定数プールに、劣化し
jdk1.8後:いいえ永続的な世代。要素空間の定数プール

  • 素子間隔:論理的ではなく、現時点で(JDK8、名前に永久記憶領域(素子領域)の後に)物理的に

JPofiler解析ツールを使用するための10、OOMの理由

10.1、どのように迅速に起こるOOMプロジェクトの失敗を排除します

あなたは、エラーの最初の数行を見ることができます:メモリのスナップショット分析ツール:MATJprofiler
ライン」----のデバッグバージョンをコードのライン分析で

10.2、メモリがいっぱいになった場合、OOM、十分ではありませんメモリ!Java.lang.OutOfMemoryErrorjavaヒープスペース

ソリューション:

  • ヒープメモリの拡張の結果を見てみてください1.

  • メモリの2分析は、問題領域を表示するには

10.3、MAT.Jprofilerの役割

分析ダンプメモリファイルは、高速なメモリリークを見つける
のデータは、ヒープが得られ
、大きなオブジェクトを取得します

10.4、いくつかの命令

11、GCのガベージコレクション

11.1、主にエデンの園の領域での年金エリア〜

11.2は、JVMがGCの間に、これらの三つの領域(新世代への、から生き残っエリア()、殿堂入り)制服リサイクルは、ほとんどの時間は、リサイクルの新世代はありません

11.3、GC 2種類

ライトGC(共通GC)
重量GC(グローバルGC)

11.4、GCのタイトル

11.4.1、JVMのメモリモデルとパーティション - 詳細に各エリアには何をしますか?

11.4.2は、パーティションから何?エデン、内部ヒープは、殿堂入りする、その特性についての話!

11.4.3、GCアルゴリズムいます

11.4.3.1、参照記法

用途オブジェクトのレコード番号

11.4.3.2、複製アルゴリズム

年金ゾーンエリアに生き残るためには、ライブ..十分な回数に地域へのエリアからオリジナルからコピー

レプリケーションアルゴリズムの最適な使用シナリオ:下の目標活動時間:若い世代

長所と短所:

  • ベネフィット

    • いいえメモリの断片化しません
    • メモリ空間の浪費:より多くのスペースの半分以上は、常にオブジェクト100%生存(極端な場合)と仮定すると、に空であります

11.4.3.3、マークスイープアルゴリズム

クリアマークされていないオブジェクトにマークされているオブジェクトを生きて、これらのオブジェクトをスキャン

長所と短所:

  • 利点
    余分なスペース
  • 短所
    2つのスキャン、時間の深刻な廃棄物を、それはメモリの断片化が生成されます

11.4.3.4、圧縮マーク

11.4.3.5、明確な圧縮をマーキング

最初の明確な数回マーキングして、圧縮されました

11.4.4、光GC、GCは、ときに何が起こったかで重かったです

11.4.5、GCの概要

  • メモリ効率的な
    複製アルゴリズム>タグスイープアルゴリズム>タグの圧縮アルゴリズム(時間複雑)
  • メモリ均一
    複製アルゴリズム圧縮アルゴリズム=マーク>タグを消去アルゴリズム
  • メモリ使用率(スペース)
    圧縮アルゴリズム>クリアラベリングアルゴリズム>コピーアルゴリズムをマーク

11.4.6ではなく、最高のアルゴリズム、唯一の最も適切なアルゴリズム

GC:世代コレクションアルゴリズム

  • 若い世代
    コピーアルゴリズムを用いて低生存率、
  • 旧の
    面積は(、あまりにも多くのメモリの断片化)+マーク圧縮ハイブリッド実装を明確なマーキング、生存大きいです

12、JNN

12.1、Javaのメモリモデル

12.2は、それをやっています

役割:キャッシュ・コヒーレンシ・プロトコル、(このルールを見つけ、コンプライアンスの)データを読み書きするための規則を定義します

各スレッドがプライベートローカルメモリを有し、スレッド間のメインメモリに記憶されている共有変数:JMMは、メモリとメインメモリを作業スレッド間の抽象関係を定義します

プログラムは、エンティティJVMスレッドを実行され、各スレッドはJVMがワーキングメモリ(スタック領域)を作成します作成されているので、ワーキングメモリは、すべての変数が格納されるの下で民間の各スレッドのデータ領域、およびJavaメモリモデルがありますメインメモリに、メインメモリは、すべてのスレッドがアクセス権を持って、メモリ領域を共有しているが、変数(読み割り当てなど)上のスレッド操作はワーキングメモリ、あなたは自分の仕事のメモリ空間にメインメモリからコピーしたい最初の変数に行われなければなりませんその後、変数は、変数の書き込み操作が戻ってメインメモリに、次に終了して動作します。あなたが直接メインメモリ変数を操作することはできません、ワーキングメモリ内の各スレッドは、メインメモリ変数のコピーのコピーに格納されているため、異なるスレッド間のスレッド間で(値によって)メモリ、通信ワーキングお互いのは、メインメモリによって行われなければならないアクセスすることはできません。

同期の12.3、JMM規定

1、最初のスレッドが共有変数の値は、メインメモリにフラッシュする必要がありますロックを解除
スレッドをロックする前に、あなたが彼らのワーキングメモリにメインメモリの最新の値を読み取る必要があり、2
ロック- 3、同じロックアンロック

12.4、JMMはスレッドセーフ

  • ワーキングメモリとメインメモリレイテンシの同期現象発生し、視認性の問題

  • あなたは、変数が他のスレッドにすぐに目に見える変更した後、彼らはスレッドを作ることができ、解決するために、同期や揮発性のキーワードを使用することができます。他の揮発性のアクションは、最適化を並べ替え禁止することであるため、命令の再配列によって引き起こされる問題と秩序の問題の可視性のために、揮発性のキーワードに対処するために使用することができます。

12.5は、JMMは3つの原則を遵守しました

12.5.1、可視性

メインメモリ操作CCP変数は自分の仕事を動作させるために、メモリの各個々のスレッドにコピーされ、その後、メインメモリに書き戻されるの各スレッドは、volatileキーワードの使用は、可視性の問題を解決します。

これは、1つのスレッドが共有変数AAAの値を変更しなくてもよい場合ではないメインメモリに書き込まれたバック、および共有変数で動作する別のスレッドBBBメインメモリが、ワーキングメモリ内の共有変数の今回のAAスレッドBBBのスレッドが表示されていないため、ワークメモリとメインメモリの同期遅延のこの種は、可視性の問題を引き起こしています。

12.5.2アトミック

マルチスレッドの同時実行に不可分、分割またはストッパなくなり、糸の複数のスレッドが存在することになるが中断されているデータが失われ、不完全な、アトミック性を保証するために、アトミック・クラス・パッケージの下に表示され

12.5.3、整然とした、即ち禁止命令並べ換え

コンピュータがプログラムを実行すると、パフォーマンスを向上させるためには、多くの場合、コンパイラやプロセッサの命令は次の三つの一般的なポイント、再配置されている必要があり
、「コンパイラの最適化の再配置- - 」命令の並列性の再配置- 「メモリシステムソース再配置- 「命令が最後に実行しました

実行とコード一貫性のある結果の順序ことを保証するために、実装プログラムの最終結果内部シングルスレッド環境。

プロセッサは、並べ替えの際に命令間のデータ依存性を考慮する必要があります

コンパイラ最適化の転位が存在するため、一貫性を確保することができる2つのスレッドで使用される変数を決定することができず、結果は予測できない、環境が交互に実行スレッドマルチスレッド

おすすめ

転載: www.cnblogs.com/zhuchengbo/p/12635407.html