1概要

このクイックチュートリアルでは、さまざまな__JVMガベージコレクション(GC)の実装の基本を示します。さらに、アプリケーションで特定の種類のガベージコレクションを有効にする方法も説明します。

** 2ガベージコレクションの簡単な紹介

**

その名前から、

ガベージコレクション

がメモリからのガベージの検索と削除を処理するように見えます。ただし、実際には、

ガベージコレクション

は、JVMヒープスペースで使用可能なすべてのオブジェクトを追跡し、未使用のオブジェクトを削除します。

簡単に言うと、

GC

はMarkとSweepという2つの簡単なステップで機能します。


  • Mark –

    ガベージコレクタがどの部分を識別するのか

メモリが使用されている


Sweep – ** このステップは「マーク」フェーズで識別されたオブジェクトを削除します

  • 利点:**

  • 未使用のため、手動でのメモリ割り当て/割り当て解除処理はありません。

メモリ空間は

GC

によって自動的に処理されます
** 処理のオーバーヘッドなし

管理(

GC

単独ではメモリリークの完全な解決策を保証することはできませんが、その大部分を処理します)。

  • デメリット:**


  • JVM

    はオブジェクト参照の作成/削除を追跡する必要があるため、

このアクティビティでは、元のアプリケーションのほかにさらに多くのCPUパワーが必要です。

大きなメモリを必要とするリクエストのパフォーマンスに影響を与える可能性があります。
** プログラマは、専用のCPU時間のスケジューリングを制御できません。

不要になったオブジェクトを解放する
** 一部のGC実装を使用すると、アプリケーションが停止する可能性があります。

予想外に
** 自動化されたメモリ管理は正しいほど効率的にはなりません。

手動メモリ割り当て/割り当て解除


3 GCの実装

JVMには4種類の

GC

実装があります。

  • シリアルガベージコレクタ

  • パラレルガベージコレクタ

  • CMSガベージコレクタ

  • G1ガベージコレクタ


3.1. シリアルガベージコレクタ

これは基本的にシングルスレッドで動作するので、これは最も単純なGCの実装です。その結果、** この

GC

実装は、実行時にすべてのアプリケーションスレッドをフリーズします。したがって、サーバー環境などのマルチスレッドアプリケーションで使用するのはお勧めできません。

ただし、QCon 2012では、

Twitter

エンジニアによるhttps://www.infoq.com/presentations/JVM-Performance-Tuning-twitter-QCon-London-2012[優秀講演]に、

Serial Garbage Collector

のパフォーマンスに関する記事がありました。このコレクターをよりよく理解するための良い方法です。

シリアルGCは、一時停止時間が少なく、クライアントスタイルのマシンで動作するほとんどのアプリケーションに最適なガベージコレクタです。

Serial Garbage Collector

を有効にするには、次の引数を使用します。

java -XX:+UseSerialGC -jar Application.java

** 3.2. 並列ガベージコレクタ

**

これは

JVM

のデフォルトの

GC

であり、スループットコレクタとも呼ばれます。

Serial Garbage Collector

とは異なり、これはヒープスペースを管理するために複数のスレッドを使用します。しかし、

GC

を実行している間、他のアプリケーションスレッドもフリーズします。

この

GC

を使用すると、最大のガベージコレクションのスレッド数、休止時間、スループット、およびフットプリント(ヒープサイズ)を指定できます。

ガベージコレクタスレッドの数は、コマンドラインオプション__-XXで制御できます。

最大休止時間目標(2つの

GC

の間のギャップ(ミリ秒))は、コマンド行オプション

-XX:MaxGCPauseMillis = <N>

で指定されます。

最大スループット目標(ガベージコレクションの実行に費やされた時間とガベージコレクションの外部に費やされた時間との関係で測定)は、コマンドラインオプション__-XXで指定されます。

最大ヒープフットプリント(プログラムが実行中に必要とするヒープメモリの量)は、オプション

-Xmx <N> .

を使用して指定されます。


Parallel Garbage Collector

を有効にするには、次の引数を使用します。

java -XX:+UseParallelGC -jar Application.java


3.3. CMSガベージコレクタ


Concurrent Mark Sweep(CMS)

実装は、ガベージコレクションに複数のガベージコレクタスレッドを使用します。短いガベージコレクションの一時停止を好み、アプリケーションの実行中にガベージコレクタとプロセッサリソースを共有できるように設計されています。

簡単に言うと、このタイプのGCを使用するアプリケーションは平均して応答が遅くなりますが、ガベージコレクションを実行するために応答しなくなりません。

ここで注意しなければならないのは、この

GC

は並行であるため、並行プロセスが機能している間に

System.gc()

を使用するなどの明示的ガベージコレクションの呼び出しはhttps://blogs.oracle.com/jonthecollectorという結果になります。/entry/what

the

heck

s

a[

並行モード障害/中断

]。

合計時間の98%以上が

CMS

ガベージコレクションに費やされ、2%未満のヒープしか回復されなかった場合、

OutOfMemoryError



CMS


collector

によってスローされます。必要に応じて、この機能を無効にするには、オプション

-XX:-UseGCOverheadLimit

をコマンドラインに追加します。

このコレクターには、Java SE 8では推奨されなくなり、将来のメジャーリリースで削除される可能性がある増分モードとして知られるモードもあります。


CMSガベージコレクタ

を有効にするには、次のフラグを使用します。

java -XX:+UseParNewGC -jar Application.java


3.4. G1ガベージコレクタ


G1(Garbage First)Garbage Collectorは、大容量のメモリを搭載したマルチプロセッサマシンで実行されるアプリケーション用に設計されています。これは

JDK7 Update 4以降およびそれ以降のリリースで利用可能です。

パフォーマンス効率が高いので、

G1

コレクターが

CMS

コレクターに代わるものになります。

他のコレクターとは異なり、

G1

コレクターは、ヒープを一連の同じサイズのヒープ領域に分割します。それぞれの領域は、連続した範囲の仮想メモリーです。

ガベージコレクションを実行するとき、

G1

は、ヒープ全体のオブジェクトの活性を判断するための同時グローバルマーキングフェーズ(つまり、フェーズ1として知られるフェーズ1)を示します。

マークフェーズが完了した後、

G1

はどの領域がほとんど空であるかを知っています。それは最初にこれらの領域に集まり、それは通常かなりの量の空きスペースを生み出します(すなわちフェーズ2は__Sweepingとして知られています)。


G1ガベージコレクタ

を有効にするには、次の引数を使用します。

java -XX:+UseG1GC -jar Application.java

** 3.5. Java 8の変更点

**


Java 8u20

では、同じ

Stringのインスタンスを多数作成しすぎることで、メモリの不要な使用を減らすための

JVM__パラメータがもう1つ導入されました。

このパラメーターは、

JVM

パラメーターとして


– XX:UseStringDeduplication


を追加することで有効にできます。


4結論

このクイックチュートリアルでは、さまざまな

JVMガベージコレクション

の実装とその使用例について説明しました。

より詳細なドキュメントはhttp://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html[ここ]にあります。