2013-10-05 9 views
18

参照されていないオブジェクトをクリーンアップする前にガベージコレクタがアプリケーションスレッドをフリーズすると、すべてのスレッドが実行中の「セーフポイント」にある必要があります。私は、セーフポイントのコンセプトを記述した豊富な文章を見つけましたが、例はほとんどありません。典型的なJavaメソッドの中にはどこにセーフポイントが置かれ、その理由は?さらに重要なことに、どこでセーフポイントが発生しないのでしょうか?Java GC safepoint

+1

まだネイティブコールを除いて、私はセーフポイントとは何かの例を見つけることができません。おそらくそれはあまり定義されていませんが、それにもかかわらずイライラします。 – Cowboy

+0

関連する例とバグ報告が検討されています[ここ](http://stackoverflow.com/q/35154352/230513)。 – trashgod

答えて

6

残念ながら、これはあまり定義されていません。 JVMは、Safepointを決定するとSafepointを配置しますが、その時点までの仕様はありません。 Javaの次のバージョン/アップデートは異なる場合があります。セーフポイントを持たないUnsafe.copyMemory()のようなケースがいくつかありますが、セーフポイントをどこに配置するかはわかりません。

+1

ええと、それはネイティブコールです。ネイティブコールはセーフポイントです...つまり、ネイティブに入り、そこにとどまるのは安全ですが、Javaコードに戻るのは安全です(GCが実行中の場合)。 – Cowboy

+1

@Cowboy正解ですが、copyMemoryは任意の長さにすることができます。コピーする時間が長いほど、Safepointに達するまでの時間が長くなります。 –

+1

@ PeterLawrey Unsafeの長さは無制限です。なぜビットは一度に1MBまでしかコピーできないのですか?これは、AFAIKを許可または安全にすることです – bond

10

safepointの正確な定義と実装は、VMの実装ごとに異なりますが、Hotspot VMを考慮すると、Safepoints in HotSpot JVMという素晴らしい定義があります。

HotSpot glossaryは言う:

すべてのGCの根が知られており、すべてのヒープオブジェクトの内容が一致しているされるプログラム実行中のポイント。グローバルな観点からは、GCを実行する前にすべてのスレッドをセーフポイントでブロックする必要があります。

通常、セーフポイントは、JVMは、メソッドへのセーフポイントのチェックを注入することにより実現され、ほとんどの呼び出しサイトがsafepointsとしての資格 - セーフポイントのチェックに到達したときにセーフポイントが必要な場合は、スレッドがチェックされます(FullGCが予定されているなど)そうであれば、スレッドはブロックする。 VMブロック内のすべてのスレッドが完了すると、VM内のすべてのオブジェクトが完全に到達可能なセーフポイントに到達しました。次に、セーフポイントを要求したVMオペレーション(例えば、FullGC)が実行され、その後スレッドが再開される。

safepointを必要とするVM操作のリストを確認してください:Safety First: Safepoints

-XX:+PrintSafepointStatistics –XX:PrintSafepointStatisticsCount=1を使用すると、ホットスポットでのセーフポイントの動作を調べることができます。

関連する問題