java - Full Gc过程会发生stop the world,这里jvm是怎么处理的呢?【面试题】
迷茫
迷茫 2017-04-18 10:05:31
0
4
912

在不采用cms垃圾收集器或者在cms垃圾收集器初始标记和重新标记阶段,都会发生stop the world,也就是会暂停用户线程的执行,jvm是如何暂停所有用户线程的?烦请知道的朋友帮忙解答一下~
在实际场景中,可能gc的时间很短,但是暂停所有用户线程会用去很大一部分时间,这个时间又是如何得知的呢?

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全員に返信(4)
Ty80

JVM には「安全ポイント」と「安全ゾーン」と呼ばれるものがあり、GC が発生すると、すべてのスレッドが「安全ポイント」まで実行されて停止します。
GC が必要な場合、JVM はスレッドが安全なポイントに達するとフラグを設定し、GC が必要であることが判明した場合はスレッド自体を一時停止し、実行を再開しません。 GC が完了するまで。

もう 1 つの戦略は、GC が発生したときにすべてのスレッドを直接一時停止し、すべてのスレッドが安全なポイントにあるかどうかを検出し、安全なポイントにない場合はスレッドの実行を再開し、実行が安全なポイントに達するまで待機することです。ライズを中断する前の安全ポイント。

ただし、CPU 時間を取得していない、または取得できない一部のスレッドについては、安全なポイントに到達するまで待つ方法がないため、現時点でスレッドが安全領域にある限り、GC を実行することもできます。安全領域はコードの一部であり、このコードセグメント内のオブジェクトの参照関係は変更されないため、この時点では安全に GC を実行できます。

いいねを押す +0
Ty80

スレッドを安全に一時停止する Java メソッドは安定していません。フル GC 時にはネイティブ メソッドを使用する必要があると思います。
注意を払って学びましょう。 。

いいねを押す +0
刘奇

フル gc を避け、大きな配列の使用を減らすようにしてください。

いいねを押す +0
迷茫

GC はそれほど頻繁には発生せず、メモリが不足している場合にのみ発生します (もちろん、絶対的なわけではありません)。そのため、世界の停止はそれほど頻繁ではなく、ユーザー スレッドに影響を与えません。ユーザー スレッドがセーフ ゾーンにある場合、ワールドを停止するには、すべてのスレッドがセーフ ゾーンに入るまで待機する必要があります。一部の長期操作では、セーフ ゾーンに到達するまでに長時間待機する可能性があります。これは、世界が gc 自体よりも長く待機する可能性があることを意味します。この問題を解決する方法は、たとえば、ループ内で一時停止できることと、安全ゾーンを適切に設定できることの間には大きな違いがあります。ループが完了した後にのみ一時停止してください。セキュリティ ゾーンの具体的な設定は、JVM メーカーの決定によって異なります

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート