- oracle.com · 高速jvm oracle jrockitの全貌入門編 oracle direct seminar

47
<Insert Picture Here> 高速JVM Oracle JRockitの全貌 入門編 Oracle Direct Seminar

Upload: phunglien

Post on 08-Aug-2018

231 views

Category:

Documents


0 download

TRANSCRIPT

<Insert Picture Here>

高速JVM Oracle JRockitの全貌入門編

Oracle Direct Seminar

Copyright© 2010, Oracle. All rights reserved.2

OTN×ダイセミ でスキルアップ!!

※OTN掲示版は、基本的にOracleユーザー有志からの回答となるため100%回答があるとは限りません。ただ、過去の履歴を見ると、質問の大多数に関してなんらかの回答が書き込まれております。

Oracle Technology Network(OTN)を御活用下さい。

・一般的な技術問題解決方法などを知りたい!・セミナ資料など技術コンテンツがほしい!

一般的技術問題解決にはOTN掲示版の

「データベース一般」をご活用ください

http://otn.oracle.co.jp/forum/index.jspa?categoryID=2

過去のセミナ資料、動画コンテンツはOTNの「OTNセミナー オンデマンド コンテンツ」へ

http://www.oracle.com/technology/global/jp/ondemand/otn-seminar/index.html

※ダイセミ事務局にダイセミ資料を請求頂いても、お受けできない可能性がございますので予めご了承ください。ダイセミ資料はOTNコンテンツ オン デマンドか、セミナ実施時間内にダウンロード頂くようお願い致します。

Copyright© 2010, Oracle. All rights reserved.3

OTNセミナー オンデマンド コンテンツダイセミで実施された技術コンテンツを動画で配信中!!

ダイセミのライブ感はそのままに、お好きな時間で受講頂けます。

※掲載のコンテンツ内容は予告なく変更になる可能性があります。期間限定での配信コンテンツも含まれております。お早めにダウンロード頂くことをお勧めいたします。

OTN オンデマンド

最新情報つぶやき中

oracletechnetjp

・人気コンテンツは?

・お勧め情報

・公開予告 など

Copyright© 2010, Oracle. All rights reserved.4

Oracle エンジニアのための技術情報サイト

オラクルエンジニア通信http://blogs.oracle.com/oracle4engineer/

• 技術資料

• ダイセミの過去資料や製品ホワイトペーパー、スキルアップ資料などを多様な方法で検索できます

• キーワード検索、レベル別、カテゴリ別、製品・機能別

• コラム

• オラクル製品に関する技術コラムを毎週お届けします

• 決してニッチではなく、誰もが明日から使える技術の「あ、そうだったんだ!」をお届けします

先月はこんな資料が人気でした

Oracle Database 11gR2 RAC インストレーション・ガイドASM 版 Microsoft Windows x86-64

Oracle Database 11gR2 旧バージョンからのアップグレード

オラクルエンジニア通信

最新情報つぶやき中

oracletechnetjp

Copyright© 2010, Oracle. All rights reserved.5

オラクル クルクルキャンペーン

Enterprise Editionはここが違う!!

• 圧倒的なパフォーマンス!

• データベース管理がカンタン!

• データベースを止めなくていい!

• もちろん障害対策も万全!

Oracle Databaseのライセンス価格を大幅に抑えて

ご導入いただけます

詳しくはコチラhttp://www.oracle.co.jp/campaign/kurukuru/index.html

あのOracle Database Enterprise Editionが超おトク!!

お問い合わせフォームhttp://www.oracle.co.jp/inq_pl/INQUIRY/quest?rid=28

多くのお客様でサーバー使用期間とされる

5年間にライセンス期間を限定

•期間途中で永久ライセンスへ差額移行

• 5年後に新規ライセンスを購入し継続利用

• 5年後に新システムへデータを移行

2010年11月30日まで

Copyright© 2010, Oracle. All rights reserved.6

以下の事項は、弊社の一般的な製品の方向性に関する概要を説明するものです。また、情報提供を唯一の目的とするものであり、いかなる契約にも組み込むことはできません。以下の事項は、マテリアルやコード、機能を提供することをコミットメント(確約)するものではないため、購買決定を行う際の判断材料になさらないで下さい。オラクル製品に関して記載されている機能の開発、リリースおよび時期については、弊社の裁量により決定されます。

OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。

Copyright© 2010, Oracle. All rights reserved.7

Agenda

Oracle JRockitとは

Oracle JRockitの内部動作について

Oracle JRockitの性能分析、障害解析機能について

Copyright© 2010, Oracle. All rights reserved.8

Oracle JRockitWebLogic Serverを構成する重要コンポーネント

• オラクルが提供しサポートする、Java SE完全準拠のServer JVM

x86/x64に最適化した業界最速のJVM(現在はSPARC版も提供)

安定性を保証するヒープメモリ管理

1998年 Ver.1リリースから12年の利用実績

GC処理の制御

突発的な処理遅延の防止

安定した挙動を実現

SPECjbb2005Last updated: Jun. 3 2010

9611262

Oracle

JRockitItanium/Linux

6972897

Oracle JRockit

Xeon X5570/Linux

5534233

Oracle

JRockitAMD Opteron

8384/Linux

5210501

IBM

J9 JVMPower/AIX

世界最高値

業界最速 安定性

レスポンスタイム(m

s)

100

150

200

250

300

100

150

200

250

300

Oracle JRockitReal time

通常JVM

Copyright© 2010, Oracle. All rights reserved.9

クライアントサイドでのJavaの利用とは異なった特徴と要求

• 特徴• マルチプロセッサマシンでの利用

• 長時間稼動

• 大きなメモリヒープサイズ

• Synchronizationの多用

• 動的なクラスローディングの多発

• 小さい単位の処理を多くのスレッドで並行実行

• ソケット通信やファイルI/Oの多用

• 要求• 高信頼性

• 可用性/管理性

• 拡張性

• 性能

JRockit の特長 - The Server Side Java VM -サーバサイドJavaの特徴と要求

Copyright© 2010, Oracle. All rights reserved.10

JRockit の特長 - The Server Side Java VM -Java VM処理の比重

TM

IO

R

CG

MM

CG

R

TMMM

クライアント サーバ

CG = Code Generation

MM = Memory Management

TM = Thread Management

I/O

R = Reflection

クライアントとは異なるサーバサイドの処理要求に特化したJava VMが必要

Copyright© 2010, Oracle. All rights reserved.11

Agenda

Oracle JRockitとは

Oracle JRockitの内部動作について

Oracle JRockitの性能分析、障害解析機能について

Copyright© 2010, Oracle. All rights reserved.12

そもそも、JVMとは?

Solaris WindowsLinuxHP-UX AIX

Any Hardware

JVM JVM JVM JVM JVM

バイトコード

Java

JVM(Java Virtual Machine)・・・Javaプログラムの実行環境-バイトコードを1行ずつ機械語(Native code)に変換し実行-各OSの機能を覆い隠す役割も担う

ハードウェア

OS

ランタイム

中間コード

ソースコード

コンパイル

配布・実行

Copyright© 2010, Oracle. All rights reserved.13

JRockit アーキテクチャ ~ネーティブコード生成~

Sun JVMの場合• バイトコードのままインタープリタで実行

• メソッドの実行回数を常時監視

• 実行回数が閾値(-XX:CompileThreshold)を超えたメソッドをコンパイルしてネーティブコードを生成

JRockitの場合① 各メソッドの初回実行時にバイトコードをJITコンパイルしてネーティブコードを生成

② バックグランドで動くサンプルスレッドが定期的にアプリケーション・スレッドの状態を監視し、頻繁に使用されているメソッドをリストアップ

③ まだ最適化されていないメソッドのうちで最も使用頻度が高いメソッドをより高速なネーティブコードへ最適化

bytecode

JITコンパイルnativecode

nativecode+

アプリスレッド監視

最適化

②③

bytecode

nativecode

メソッド実行

回数監視

コンパイル

②③

ネーティブ実行 ネーティブ実行

インタプリタ実行 ネーティブ実行

Copyright© 2010, Oracle. All rights reserved.14

コード最適化を示す例

最適化されたコードでは、クラス A を実行するたびにクラス B を実行する必要がない

Copyright© 2010, Oracle. All rights reserved.15

JRockit アーキテクチャ ~スレッドローカルエリア(TLA)~

• TLAが無いと ・・・ 各スレッドはオブジェクトをアロケートするたびにヒープのロックを得る必要があるので遅い

• TLAが有れば ・・・ 各スレッドの専用エリアにオブジェクトをアロケートできるので速い(もちろんアロケート済みオブジェクトは他スレッドからも利用可能)

Thread 1 Thread 2 Thread 3

Heap lock

a = new Object(); c = new Object();b = new Object();

Thread 1 Thread 2 Thread 3

a = new Object(); c = new Object();b = new Object();

TLA for

Thread 1

TLA for

Thread 2

TLA for

Thread 3TLA for

Thread 1

Heap lock

Copyright© 2010, Oracle. All rights reserved.16

JRockit アーキテクチャ ~メモリレイアウト~

Javaの「オブジェクト」はSun JVMでもJRockitでもヒープに置かれる

Javaの「クラス」はSun JVMではPermanent領域、 JRockitではNative領域に置かれる

JRockitではSun JVMにおけるSurvivor(From&To)に相当する領域は無く、NurseryがフルになるとOldにすぐに昇格する

よって、JRockitでは、初回GCで生き残ったオブジェクトは全て以降はFull GCのチェック対象になるが、Full GCが発生しても問題ないような様々な工夫がされている

JRockitでは高速化等を目的にSun JVMには無い様々な情報がNative領域に置かれる

OldNursery

OldEden Survivor

ToFrom

Xmn

Sun JVMの場合

Xmx/XmsXns

Xmx/Xms

-XX:PermSize

-XX:MaxPermSize

Native

Nativ

e

Perm

anent

JRockitの場合

ヒープ

ヒープ

0 1

0 1 32

1回でプロモーション

最大32回でプロモーション

New

Copyright© 2010, Oracle. All rights reserved.17

Parallel GCとConcurrent GC

Parallel Concurrent従来のGC

STOP-THE-World!!

STOP-THE-

World!!

従来のGCでは、GCを一つのスレッドで実行し、その間アプリケーションスレッドは停止(STOP-THE-WORLD)していました。そのためマルチCPUマシンでGCの間待機するCPUが存在しスループットが低下する原因となりました。これへの対策が、GCを複数スレッドで実行するパラレルGC、アプリケーションを止めずにGCを1スレッドで実行するコンカレントGCです

CPUに処理が割り当てられず性能が低下

ご参考

Copyright© 2010, Oracle. All rights reserved.18

JRockit ガーベッジ・コレクション① Parallel Garbage Collection (for New GC and Old

GC)

JVMは1CPUあたり1GCスレッドを並列に使用して一気にGCを行う。GCの間はアプリケーションスレッドは完全に止まるが、トータルでのアプリケーションのスループットは最も高くなる。

Java

application

threads

Garbage Collector

threads

Copyright© 2010, Oracle. All rights reserved.19

JRockit ガーベッジ・コレクション② Mostly Concurrent Garbage Collection (for Old GC)

1つのGC専用のスレッドがGC処理のほとんどのフェーズをアプリケーションと同時に行う。GC中のアプリケーションのスループットは落ちるものの、停止は避けられる。

Java

application

threads

Garbage Collector

thread

GCスレッドがヒープ内のオブジェクトの移動と削除を行うときのみ、短時間アプリケーションスレッドが止まる。

Copyright© 2010, Oracle. All rights reserved.20

JRockit アーキテクチャ ~ガーベッジ・コレクション~ガーベッジ・コレクション方式の指定方法

動的GC重視する指針のみを指定し、GCアルゴリズムについてはJRockitが内部で最適な組み合わせを動的に選択

重視する指針 指定方法

アプリケーションのスループット

(デフォルト)-XgcPrio:throughput

個々のGCポーズタイムの短縮

-XgcPrio:pausetime -XpauseTarget=<n>ms

アプリのレスポンスタイム(JRockit Real Timeでのみ利

用可能)

-XgcPrio:deterministic -XpauseTarget=<n>ms

Copyright© 2010, Oracle. All rights reserved.21

0

15

30

45

60

75

90

105

120

0 2000 4000 6000 8000 10000 12000 14000 16000 18000

JRockit Real Time

0

15

30

45

60

75

90

105

120

0 2000 4000 6000 8000 10000 12000 14000 16000 18000

低トランザクション時:GCによる一部タイムアウトが発生しうる

高トランザクション時: GCによる停止により、レスポンスタイムが劣化する

0

15

30

45

60

75

90

105

120

0 2000 4000 6000 8000 10000 12000 14000 16000 18000

従来のJavaでは困難だった予測可能なレスポンスを実現

従来のJava

JRockit Real Timeは、Deterministic GCにより、GC停止時間を抑制→ 安定したレスポンスを提供アプリケーションに手を入れる必要なし

JRockit Real Time

Copyright© 2010, Oracle. All rights reserved.22

Deterministic GC - JRockit Real Time

Mostly Concurrent GC をさらに改善1世代ヒープ(NurseryとOld間の参照や移動のコストを削減)個々のPauseTimeの制限付け(-XpauseTarget=XXms)

ただし、あくまで努力目標。アプリ特性とヒープ設定によっては守れないことも。

アプリスレッドを止めなければならないGCのフェーズをパラレル化オブジェクトの生成速度を随時観察し、GCのスケジュールを最適化

例) ヒープ全体を一度にGCするのではなく、複数回の短いGCに分割例) ヒープが一杯になる前に早めにGCを開始例)開始したGCが予定時間内に終わりそうにない場合に、

一旦GCを中止し、可能なら残作業を次回GCに繰り越し

Java

application

threads

Garbage Collector

threads

Copyright© 2010, Oracle. All rights reserved.23

JRockit動的GCアルゴリズム別性能比較

スループット

レスポンス

ポーズタイム

Deterministic GCポーズタイム優先GCスループット優先GC

Copyright© 2010, Oracle. All rights reserved.24

Agenda

Oracle JRockitとは

Oracle JRockitの内部動作について

Oracle JRockitの性能分析、障害解析機能について

Copyright© 2010, Oracle. All rights reserved.25

JRockit Mission ControlJRockit 専用のGUI ベースの運用監視ツール TCP/IP ベースのプロトコルでリモートのJRockitプロセスの運用監視が可能

監視されるJRockit側は以下のオプションでポートを開けるだけ(エージェント等のインストール不要)例: -Xmanagement:port=7091,ssl=false,authenticate=false

機能一覧 Management Console: CPU 使用率、ヒープ使用状況、スレッド使用状況、MBean監視

Memory Leak Detector: 迅速なメモリリーク検出、オブジェクトの参照関係の階層表示

JRockit Flight Recorder: GC 詳細情報、ホットパッケージ、ホットメソッド情報

Copyright© 2010, Oracle. All rights reserved.26

Management Console稼動中のJVMを監視するコックピット

• リソースの使用状況を把握して性能劣化の原因を探る• CPU使用状況、メモリ使用状況(JVM/Machine)をグラフ表示

• 任意のMBean情報の閲覧、更新、グラフ化、トリガ・アラートの設定

• スレッド情報(スタックトレース、CPUビジー、デッドロック有無)の確認

• メソッドプロファイリング

監視対象に与えるオーバーヘッドは軽微

Copyright© 2010, Oracle. All rights reserved.27

Memory Leak Detector動的なヒープ診断によるメモリリーク検出

• メモリリークの原因となるオブジェクトの特定• サンプル中のオブジェクト増加数、サイズ、インスタンス数、ヒープ中の割合

• 各オブジェクトを参照しているオブジェクトスタックを階層的に表示

• 統計情報の取得・監視によるオーバーヘッドは軽微• GCのマーク・フェーズを巧みに利用してヒープ上のクラス別メモリの統計情報を取得

旧来のヒープダンプ採取方式に比べて飛躍的に軽快

Copyright© 2010, Oracle. All rights reserved.28

Javaアプリケーションの性能問題の分析Management ConsoleによるJVM稼動状況の可視化

• 稼動状況をリアルタイムに可視化するJVMコックピット

任意のJVMプロファイルを選択して可視化

ダイヤル/グラフ形式でのスタイル表示

頻繁に参照するプロファイルを用途に合わせてダッシュボード化

Copyright© 2010, Oracle. All rights reserved.29

• メソッド/スレッドプロファイリングにより処理負荷傾向を検出

Javaアプリケーションの性能問題の分析Management Consoleによる稼動状況JVMの可視化

プロファイリング対象メソッドを任意に指定してメソッドあたりの処理占有時間を把握

スタックトレースから処理内容を把握

メソッドプロファイリングを開始してメソッド毎の実行時間を計測

各スレッドのCPU使用率やデッドロック検出によりスレッドのリソース利用状況を把握

Copyright© 2010, Oracle. All rights reserved.30

Javaアプリケーションの性能問題の分析Memory Leak Detectorによるメモリリーク検出

• 増加傾向の高いオブジェクトをメモリリークと推定

• 増え続けるオブジェクト= 解放よりも割り当ての方が多い

• 明示的にGCを実施してヒープ使用の増加傾向を正確に把握

傾向分析前に数回GCを実施

増加傾向の高いオブジェクトに注目

増加傾向の高いオブジェクトの関連状況を追跡

Copyright© 2010, Oracle. All rights reserved.31

Javaアプリケーションの性能問題の分析Memory Leak Detectorによるメモリリーク検出

• 参照関係のあるオブジェクトを追跡

• 参照数の多いオブジェクトのタイプを追跡してリーク箇所を追跡

• 参照関係を順次追跡して根本原因となるオブジェクトのタイプを絞り込み

リーク傾向のあるオブジェクトタイプの参照関係を展開

参照数の多い参照オブジェクトのタイプを追跡

さらに参照関係を展開し根本原因を絞り込む

Copyright© 2010, Oracle. All rights reserved.32

Javaアプリケーションの性能問題の分析Memory Leak Detectorによるメモリリーク検出

• オブジェクトのタイプからリークしているインスタンスを追跡

• インスタンスの追跡により割り当て箇所の特定が可能

増加傾向のあるオブジェクトを格納するオブジェクト・タイプを特定

リークしているインスタンスを追跡して割り当て箇所を特定

Copyright© 2010, Oracle. All rights reserved.33

Javaアプリケーションの性能問題の分析Memory Leak Detectorによるメモリリーク検出

• 増加傾向のあるオブジェクトのインスタンスを順次追跡

• 最終的に該当オブジェクトを保持するスレッドを特定可能

インスタンスの保持関係を追跡

増加傾向のあるオブジェクトを保持するスレッドを特定

Copyright© 2010, Oracle. All rights reserved.34

Javaアプリケーションの性能問題の分析Memory Leak Detectorによるメモリリーク検出

• 増加傾向のあるオブジェクトの格納元からトレース

• 増加傾向のあるオブジェクトを格納している箇所を特定

• メモリリークを引き起こしている箇所を正確に突き止める

増加傾向のあるオブジェクトを格納するインスタンスの割り当てを確認する

スタックトレースから該当オブジェクトの割り当てを行っているアプリケーション位置を把握

増加傾向のあるインスタンスを割り当てているトレース情報を追跡

Copyright© 2010, Oracle. All rights reserved.35

JRockit Flight Recorder障害対応を強力に支援するOracle JRockitの新機能

Java EE/ISVアプリ

Oracle WebLogicServer

OracleJRockit

メモリ利用率の増加傾向 メモリ内データの内訳と増加率JRockit Flight Recorder

自動記録常時記録"録りっぱなし"

自動ファイル出力

DB関連処理内訳とSQL毎の負荷リスト

記録されるデータ(例)

Javaスレッドの処理状況GUIツール

特徴③アプリ修正不要

特徴②情報消失の防止

特徴①画期的な低負荷技術

その他多数…

[これまでの障害対応の課題]

•ログでは足りない情報不足

•ダウンや再起動による情報消失

[JRockit Flight Recorderによる解決]

•詳細情報を常時記録

•自動ファイル出力機能

Copyright© 2010, Oracle. All rights reserved.36

Copyright© 2010, Oracle. All rights reserved.37

Copyright© 2010, Oracle. All rights reserved.38

Copyright© 2010, Oracle. All rights reserved.39

是非JRockitを使ってみてください!!

• 評価版ダウンロード

• Oracle JRockit JDK R28.1(JRockit Mission Controlを含むJRockit JDK)

• http://www.oracle.com/technetwork/middleware/jrockit/downloads/index.html

• WebLogic Server 10.3.3(JRockit R28.0を同梱したWebLogic Server)

• http://www.oracle.com/technology/global/jp/software/products/ias/htdocs/wls_

main.html

• 関連マニュアル

• Oracle JRockit Flight Recorder Runtime Guide

• http://download.oracle.com/docs/cd/E15289_01/doc.40/e15070/toc.htm

• Using WLDF with Oracle JRockit Flight Recorder

• http://download.oracle.com/docs/cd/E14571_01/web.1111/e13714/using_flig

htrecorder.htm

• JRockit -XX Command-Line Option

• http://download.oracle.com/docs/cd/E15289_01/doc.40/e15062/optionxx.htm

• JRMC Eclipse Update Site

• http://www.oracle.com/technology/software/products/jrockit/missioncontrol/updat

es/base/4.0.1/eclipse/

Copyright© 2010, Oracle. All rights reserved.40

(おまけ)Collecting and Packaging Flight

Recording Data from Disk Buffers

• JRockit R28.1のNew Featureのひとつ• This release of Oracle JRockit introduces the command-line

tool oracle.jrockit.jfr.tools.ConCatRepository, that allows you

to extract JRockit Flight Recorder data that has been written

to disk, but not handled and packaged as a flight recording,

and then create a flight recording from it. This feature is useful

when you have flight recording buffers on disk and the JVM

terminates in such a way that .jfr files are not assembled to a

complete flight recording file.

Copyright© 2010, Oracle. All rights reserved.41

http://www.oracle.co.jp/inq_pl/INQUIRY/quest?rid=28

Oracle Direct 検索

あなたにいちばん近いオラクル

Oracle Directまずはお問合せください

Web問い合わせフォーム フリーダイヤル

専用お問い合わせフォームにてご相談内容を承ります。

※フォームの入力には、Oracle Direct Seminar申込時と同じログインが必要となります。

※こちらから詳細確認のお電話を差し上げる場合がありますので、ご登録されている連絡先が最新のものになっているか、ご確認下さい。

0120-155-096

※月曜~金曜 9:00~12:00、13:00~18:00

(祝日および年末年始除く)

システムの検討・構築から運用まで、ITプロジェクト全般の相談窓口としてご支援いたします。

システム構成やライセンス/購入方法などお気軽にお問い合わせ下さい。

Copyright© 2010, Oracle. All rights reserved.42

Copyright© 2010, Oracle. All rights reserved.43

JRockit 診断コマンド ~jrcmd~

同一マシン上で稼働中のJRockitインスタンスに対してコマンドを発行して、JRockit内部の様々な情報を得たり、動作設定を変更することが可能 jrcmd <pid> <command>

主要コマンド start_management_server JRMCポートを開ける

kill_management_server JRMCポートを閉じる

startjrarecording JRAレコーディングを開始

stopjrarecording JRAレコーディングを停止

print_object_summary クラス別インスタンス数/メモリ使用量など表示

print_class_summary クラスロードされているクラスを全て表示

print_threads スレッドダンプを表示

print_memusage メモリ領域(Heap/Nativeなど)ごとの使用状況表示

runsystemgc Full GCを強制実行

verbosity 冗長ログの出力項目/出力先の変更

help 使用可能なコマンド一覧、各コマンド使用方法

ご参考

Copyright© 2010, Oracle. All rights reserved.4444

GCアルゴリズム概要

• マーク&スイープ アルゴリズム

JRockitを含め多くのJava VMは、マーク&スイープ アルゴリズムによってGC対象となるオブジェクトを決定し、オブジェクトが利用していたヒープ領域を回収します。

• オブジェクトの移動(コンパクションとプロモーション)

生存中のオブジェクトがヒープ全体にちらばると、空き領域の連続長が短くなります。これをフラグメンテーションが進んだ状態と呼び大きなオブジェクトの生成時の領域確保に失敗する可能性を秘めています。

生存中のオブジェクトを移動し、十分に連続した空き領域を確保する処理をコンパクションと呼びます。特に世代管理されたヒープで世代間に渡ってオブジェクトを移動することをプロモーションと呼びます。

実際にはオブジェクトの移動はスイープフェーズの一部として行われますが、論理的には別フェーズと考える方が単純です。

マークフェーズスイープフェーズ

コンパクション/プロモーションフェーズ

1回のGC

JVM一般ご参考

Copyright© 2010, Oracle. All rights reserved.4545

マークフェーズ

マークフェーズでは、全てのスレッド(ルートセット)からオブジェクトの参照を辿り、参照可能(利用されている)なオブジェクト全てに利用中マークをつける処理が行われま

す。

スレッド1 スレッド2 スレッド3 スレッド4

レ レ レ レ

レレ

ルートセット

チェックの付かなかったオブジェクトがGCの対象となる

JVM一般ご参考

Copyright© 2010, Oracle. All rights reserved.4646

スイープフェーズ

スイープフェーズでは、ヒープを端から走破して、マークの付いていないオブジェクト

を回収します。回収された領域は前後の空き領域と合わせられ、空き領域リストとして管理されます。

レ レ レ レ レ レ レ

ヒープ領域

空き領域リスト

アドレス 領域長

JVM一般ご参考

Copyright© 2010, Oracle. All rights reserved.4747

コンパクションフェーズ

コンパクションフェーズでは、利用中のオブジェクトを移動(再配置)して大きな空き領域を作成します。オブジェクトの移動に伴い、そのオブジェクトへの参照も全て書き換えられます。JNIで利用されている等Java VMが参照を全て把握できないオブジェクトは移動できずピンドオブジェクトと呼ばれます。

コンパクション

ヒープ領域

JVM一般ご参考