JVMのメモリ配分
- スレッド共有データ領域:
メソッド領域- >クラス情報、静的変数は
ヒープ- >オブジェクトの配列 - スレッド検疫
仮想マシン・スタック- >メソッド
のネイティブメソッドスタック- >ローカルネイティブメソッドライブラリ - スタック、プログラムカウンタ
- JVMの運転データ
プログラムカウンタ
現在のスレッドによって実行される分離におけるバイトコードの行番号スレッド、比較的小さなメモリ空間は、独立した実行ユニットであり、CPUによりOOMずにのみ場所の実装は、仮想マシンによって維持され、それがOOM表示されません
VMスタック
Javaメソッドが実行されます
メソッド呼び出しは、スタックフレームの間の仮想マシンスタックにスタックフレームであるローカル変数テーブル(可変)、オペランドスタック(+ Bの結果を格納する)、ダイナミックリンク(オブジェクト参照アドレス)、メソッドの出口(の値リターンStackOverflowErrorが許可されるスレッド要求された仮想マシンの深さよりも大きい)スタックの深さ
ネイティブメソッドスタック
Java実行メモリ領域がスタックフレームのホットスポットがあるとして、Java仮想マシンとネイティブメソッドは、1台のスタックのJVM Java仮想マシンにスタック、ネイティブメソッドでは、標準のネイティブメソッドスタックであると離れてスタック
ヒープ
Javaのメモリ格納領域オブジェクトのインスタンスは、ほとんどすべてのオブジェクトインスタンスがすべてのスレッドが新しい世代、古い年を共有し、ここで割り当てられているjmapの-heap PID。
メソッド地区
メモリの各スレッド共有メモリ領域に、(ガベージコレクタできる管理領域を聞かせ)仮想マシン情報、定数、静的変数、コードとパーマネント生成とデータホットスポット実装領域の他のタイプをコンパイルする時コンパイラをロードされています定数プールエリアは、彼がメモリ割り当てのニーズを満たすことができなかったOOMを、スローリカバリーおよびアンインストール
ランタイム定数プール
実行時定数プールは、ゾーン方式の一部であり、クラスフィールド、加えて、方法、定数プールのインタフェース、クラスがロードされた時定数プールの記憶領域の操作方法にコンパイラ生成リテラルおよび記号参照を格納する、この部分の量。
ますRESDLL.DLL構造HashSetの方法は、領域の一部であり、この方法は、領域によって制限され、依然としてOOM
Javaオブジェクトの作成
- 新しい命令は、定数プールは、それがすでにによってロードされている、何の基準シンボルが存在しない決定されます
- クラスは、ロードされ解析され、初期化されているかどうかを決定します
- 新しいオブジェクトがヒープメモリのJavaに割り当てられているため
1)ポインタ衝突(比較メモリニート)
:失敗時の再試行の方法によって結合1. 2.移動ポインタが割り当てられたメモリ、非アトミックステップの並行性の問題が生じることが、Java仮想マシンCASアトミック更新動作保証
)フリーリスト2(カオスメモリ)
メモリヒープメモリフリーアドレス
:1. 2.ステップ並行性の問題が生じる可能性が割り当てられたメモリの空きリスト・アドレスが非アトミック変更、Java仮想マシン結合CAS障害リトライこれは、アトミック更新操作を確保することを意味します - メモリ空間に割り当てられますが、ゼロ値に初期化されます
- 設定されたオブジェクトのヘッダ情報(GC世代年齢、ハッシュコード、オブジェクトのメタデータ情報)
- 実行
方法
Javaオブジェクトのメモリレイアウト
オブジェクトの属性値 - >データオブジェクトの最初のインスタンスは、64ビット、64ビットマシン、マシン32、メモリ32、8の倍数に格納します
Javaオブジェクトへのアクセス
- ダイレクトアクセスポインタ
- 訪問ハンドル
コントラスト: - アクセス効率:高効率ダイレクトアクセスポインタ(このようにホットスポット)
- ガベージコレクション:のみプールを更新し、ガベージコレクタハンドルを高いアクセス効率を取り扱い、およびダイレクトアクセス方式は、参照ポインタのアドレスを更新する必要があります
ガベージコレクションのアルゴリズム
- 基準カウント
オブジェクトインスタンスが変数に割り当てられている場合、他の変数が参照されるオブジェクトに割り当てられている場合、カウント変数が1に設定されている、+1(A = B、次いでBオブジェクトインスタンスの参照カウンタ+ 1)をカウント、ライフサイクルにわたるオブジェクトのインスタンスへの参照(メソッドを実行する)、または、新しい値に設定されている場合、-1のオブジェクト参照カウンタのインスタンスは、
円形の基準解決できない
到達可能性分析
GCルート(VMスタックネイティブメソッドスタックに参照されたオブジェクト参照されるオブジェクト、オブジェクト属性は、静的メソッド領域、方法一定の基準オブジェクト領域)を参照 - マーク-スイープ
オブジェクトタグは後に統一され、回復が完了したことをマーキング、回収する必要がある
未満:
2つの明確なプロセス効率をマーキング、1効率高くない
2スペースの問題、離散的なメモリ断片化マークの数が多い、過度の破片をクリアした後プログラムは、より大きなオブジェクトを割り当てる必要があるとき、あなたは十分な連続したメモリを検索し、事前にガベージコレクションのアクションをトリガしなければならなかったことができません - マーク-コピーは
、空のメモリブロックB(生存者)は、メモリブロックのライブオブジェクトをコピーし、(からエデン+サバイバー)メモリブロックA
複数のオブジェクトをリサイクルする場合には、オブジェクトが移動のごく一部
エデン。サバイバーから:= 8 :. 1 :. 1サバイバーに
98%対象"死Chaosheng夕方"、新世代のメモリは、90%(80%+ 10%)、対象の98%が再利用される一般的な、90%未満に利用可能ですオブジェクトは(オブジェクトの10%以上が生存)を回収する際に、スペースへのサバイバーが十分ではありません、我々は古いの配分の保証に依存する必要があります - マークは-仕上げ
古い、レプリケーションアルゴリズムに適していないのです - 2.追加のコピー操作は、50%が無駄なスペース3は、多くの場合、古い時代のオブジェクトの追加スペースの割り当て4.可能な保証、100%の生存率を必要と増加しました
ステップ:
- マーク
- オブジェクトの生存を仕上げすることは、一方の端部(左上)に移動さストラクチャードと決して定期的になり、その後、境界の外に直接メモリを一掃されます
シリアルコレクター
ガベージコレクタ、ユーザスレッド最初の仮ポイントを確保するためのシングルスレッド、その後、シングルスレッドのシリアルGCスレッドは、リサイクルおよびその他のGCスレッドを終了し、継続的な機能の前に、ユーザのスレッドだった:世界の停止
シーンを:デスクトップアプリケーション(GC短い時間)に新世代で、クライアント端末
ParNewコレクター
マルチスレッドシリアルコレクタのバージョン新世代のために、サーバモード-XXで実行されている、CMSコレクタで動作する唯一の方法:ParallelGCThreadsガベージコレクタ= CPUコア数(過剰消費がコンテキスト切り替えを引き起こす可能性がある)並列スレッドの数を制限します:パラレルガベージコレクション内の複数のスレッドは、ユーザーが依然として同時スレッドペンディング:並行ユーザスレッドのガベージコレクタ、ユーザスレッドとガーベッジ・スレッドは異なるCPU上で実行さ
並列スカベンジコレクタ
コレクターの新世代、コピーアルゴリズム、並行マルチスレッドコレクタの問題特定の優先コレクタ(スループット= CPU例えば、ユーザコードの実行時間/ CPU時間の合計を実行しているユーザスレッドの実行時間の99%を、1%の回復時間ごみ、そして高いスループットは、ユーザーのための対話タスクCMSガベージコレクションの休止時間を短縮するためにあまりにも多くの注意せずにバックグラウンドでの動作に適した、できるだけ早くプログラムを完了するためのCPU時間コンピューティングタスクの効率的な利用、することができます)99%スループット対話型プログラム、良好な応答速度は、ユーザーエクスペリエンス-XXを向上させることができますGCTimeRatioパラメータ、99%のデフォルトは(時間のユーザスレッドCPUの合計時間の99%を占める):MaxGCPauseMillis GCは、時間パラメータを一時停止し、パラメータが頻繁にGC-XXがしますが小さすぎます
シリアル・オールド・コレクター
アルゴリズム - シリアルは古いシングルスレッド歳コレクタ、「フィニッシュマーク」のコレクターズ版です
パラレルオールド・コレクター
アルゴリズム - 古いマルチスレッド歳コレクタ、「仕上げマーク」の並列スカベンジコレクタのバージョンがあります
CMSコレクタ
所望のポーズコレクタ、「マーク - スイープ」の最短回復時間取得インターネット注目するシステムに応じて、アルゴリズムを、B / Sシステム
ステップ:
- 初期マーク(およびないユーザスレッドが同時に実行、時間のかかる短い) - 非常に速く、GCのルーツに直接リンクすることができますどのようなオブジェクトマーキング
- 並行マーク(そして、ユーザスレッドは、一緒に時間のかかるを実行) - 同時マーキング相がGC RootsTracingを行い、GCの参照チェーンを探して
- (ユーザスレッド、短い時間のかかるで実行されていない)ラベル変更 - による同時ユーザースレッドに補正期間をマークするには、記録マークを生成著しい変化につながります
- 全メモリ領域をスキャンする - 同時クリア(およびユーザースレッドは、一緒に時間のかかるを実行します)
短所:
- CPUリソースに非常に敏感(長時間コンカレントマークフェーズ、ユーザスレッドのCPU時間を占有)
- 浮動ごみ処理できない(同時明確な、ユーザスレッド時のプログラムを新しいごみを生成)
- マーク - スペースデブリのスイープ世代
G1コレクタ
サーバ・アプリケーションのためのガベージコレクタ領域- >思い出しセット(循環参照を解決)
:(基準書き込み動作のプログラムタイプ参照基準タイプをチェック)参照をチェックするステップ
- 初期ラベル - オブジェクトタグが直接にリンクすることができGCルーツ
- 並行マーク - ライブオブジェクトを識別するために、GCルート到達可能性解析からオブジェクトをヒープし始め、この段階では、長い時間がかかりますが、ユーザプログラムの実行によって複雑にすることができます
- 最終マーク(思い出し設定Logs->思い出しセット) - 仮想マシンはこの期間にスレッド思い出しセットのログ内のオブジェクトの変更を記録します、原因生成された記録マークの部分の著しい変化をもたらし、ユーザプログラムの継続動作に並行マーク中に補正、最終段階はで記憶セットに思い出しセットのログデータをマージする必要性をマーク
- リサイクル(ライブデータをカウントし、避難を)フィルタ-だけ思い出し設定されたスキャンする必要がある
利点を: - メインと地域に基づいて「リフレッシュタグ」 - 複製アルゴリズムの使用の間
- 予測可能な一時停止、停止時間が減少しますが、低一時停止の追求から離れてG1され、休止時間モデルは、予測可能な確立することができます
- 直接地域をリサイクルするためのJavaヒープ上のG1(新生代歳、もはや物理的に分離、彼らは地方の一部ではありません)
- 予測可能な停止時間モデルは、G1は、許可された各収集時間に応じて、優先順位リストを維持するために、バックグラウンドで(空間回収及びリサイクルが必要な経験の時間を取得し)ごみ積算値の大きさの内部の個々の領域を追跡します優先度の回復値の最大リージョン
ヒープメモリの割り当て
Javaヒープの配布
オブジェクトの割り当て規則:
- 新世代エデン区画された領域の主なオブジェクト(領域面積、地域エデンからライブオブジェクトをコピーする地域エデンは、ゾーンからは、次のガベージコレクション、エリアから標的領域にコピーされた、その後、回収されます)
- あなたがスレッドローカルバッファの割り当てを開始した場合、優先順位は、スレッドTLABに割り当てられます
- まれに、それはまた、直接(より古い年の面積に直接フィットするには)古い年に割り当てることができ、
ラージ・オブジェクトの割り当て
ラージオブジェクトは、Javaオブジェクトである連続した大量のメモリ空間を必要とする、最も典型的には、大きなオブジェクトの一種である長い文字列、および-XXの配列です:エデンの領域に、PretenureSizeThreshold設定オブジェクトは、古い時代に直接割り当てられた値よりも大きいと避けますメモリレプリケーションの多くは2つのSurvivior領域との間に発生します
調剤スタックとエスケープの分析
エスケープ解析:動的範囲を検体オブジェクトがメソッドで定義されている場合は、方法エスケープと呼ばれる外部メソッドによって参照されてもよいです。それも、このようなスレッドが逃げると呼ばれる他のスレッドによってアクセスされる変数またはクラスインスタンス変数への代入としての雄ねじアクセスであってもよいです。スタック上に割り当てられた:プロセス変数と直接法の完了後に自動的に破棄、スタック上に割り当てられたオブジェクト、ガベージコレクタは、それによってシステム性能-XXを向上させる、介入を必要としない:+ DoEscapeAnalysisオープンエスケープ分析(デフォルトでjdk1.8) - XX:-DoEscapeAnalysis近いエスケープ解析
コマンド
- ps -ef | グレップのJava
- JPS -m(起動パラメータ)-l(クラス名)-v(JVMパラメータ)
- 様々な状態情報を実行している27660台の250台の20モニターの仮想マシン-gc JSTAT
- 27660図Jinfoのプロセス仮想マシン(指定表示されていない)パラメータ情報を調整します
- jmapの生のヒープ・ダンプ・スナップショット-XX:+ HeapDumpOnOutOfMemoryError
jmapの-heap 9366;
jmapの-histo 9366 |ほか、ヒープ統計の表示オブジェクト
jmapの-dumpの:フォーマット= B、ファイル = /ユーザ/ mousycoder /デスクトップ/ a.bin 9366 生成ダンプファイル
-Xmx20m -XX:+ HeapDumpOnOutOfMemoryError -XX:HeapDumpPath = /ユーザ/ mousycoder /デスクトップ/
グラフィカルな分析ヒープ/Users/mousycoder/Desktop/java_pid9783.hprof jhat
java.lang.StringでS WHEREからSELECT s.toString()( s.value!= nullの&& s.value.length> 1000年 ) - jstackスレッドのスナップショット(スレッドを実行し、各仮想マシン内のスタックの収集方法は、メインスレッドは、問題を見つけるために使用される)
実行されたタスクを閉じる前shutdownHook
jstack -l -F PID強制出力
スレッド状態
- 新着
- RUNNABLE
- この状態でブロッキングモニタースレッドの受動的待機をブロックBLOCKED(エントリーセット)
- WAITINGこの状態でブロックされたスレッドの特定のアクションを実行するために別のスレッドを無期限に待機しているイニシアチブ明示的なアプリケーション(設定を待ちます)
- TIMED_WAITINGは制限はこの状態でアクションスレッドを実行するために別のスレッドを待っています
- 終了したスレッドはexcutionを完了します
JConsoleの
JMXベースのビジュアル監視、管理ツールのJMXオープンポートはnohup javaの-Xms800m -Xmx800m -Djava.rmi.server.hostname = 192.168.1.250 -Dcom.sun.management.jmxremote.port = 1111 -Dcom.sun.management.jmxremote。 SSL =偽偽= -Dcom.sun.management.jmxremote.authenticate -jar HC-充電-server.jar&
インターネットの発展プロセスjconsoleをメモリ分析的思考のプロセス
FullGC
マイナーGC:エデンの領域がいっぱいになると、マイナーGCFullGCをトリガ:
- -XXにより、全GC仮想マシンをお勧めしますにSystem.gc()を呼び出します。RMIは)(にSystem.gc + DisableExplicitGCをHexに呼び出し、
- 上記の理由を避けるために古いの直接古い時代に大規模なオブジェクトのためのスペースの不足、長寿命のオブジェクト、古い時代に、スペースはフルGCの実装後も不足している場合、その後、OutOfMemoryErrorが発生して皿には、可能な限りのオブジェクトを作るためにチューニングする際に、フルGCを引き起こしましたマルチの新世代内のオブジェクトは、いくつかの時間のために存続し、あまりにも大きなオブジェクトや配列を作成しないように、マイナーGCステージは、回収され、
- コピーアルゴリズムマイナーGCメモリ空間を使用してスペース割り当て保証の障害は、障害がHandlePromotionFailure保証を発生した場合、それは完全なGCの引き金となる、老後のための担保として必要な
提案を: - -Xmx小型化、時間GCの短縮(より大きなヒープメモリが設けられている、より長い時間フルGC休止時間が長くなります)
- クラスタの展開
インターネットの問題
- ホワイトリスト問題の
解決方法:(溶液の少量が同じではない、大きなユーザとユーザシステム)list.contain-> set.contain->ブルームフィルタを - デッドロック
ソリューション:jstackと新しいスレッドの名前を持参 - ヒープメモリリーク
FullGCは、1日〜2倍の通常の周波数表示され
OOM +にjmapの、ヒープ・ダンプ:ソリューション jhatを - ヒープ外部メモリリークが発生
ヒープヒープの使用率が非常に低いですが、OOMとFull GCそこ
ソリューション:btrace
研究のヒント
- 知識システム
- インタビューfacie知識マップの前に
- 勝利を主張