検索

ホームページ  >  に質問  >  本文

java - Full Gc过程会发生stop the world,这里jvm是怎么处理的呢?【面试题】

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

迷茫迷茫2889日前929

全員に返信(4)返信します

  • PHP中文网

    PHP中文网2017-04-18 10:07:31

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

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

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

    返事
    0
  • PHP中文网

    PHP中文网2017-04-18 10:07:31

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

    返事
    0
  • 怪我咯

    怪我咯2017-04-18 10:07:31

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

    返事
    0
  • 迷茫

    迷茫2017-04-18 10:07:31

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

    返事
    0
  • キャンセル返事