なぜのThread.sleep(0)rocketmqにGC防ぐことができますか?

シュトゥーベン:

最近、私はRocketMQでソースコードを読んで、私はこのコードを理解can`t。なぜ、このコードは、GCを防ぐことができますか?

https://github.com/apache/rocketmq/blob/master/store/src/main/java/org/apache/rocketmq/store/MappedFile.java

for (int i = 0, j = 0; i < this.fileSize; i += MappedFile.OS_PAGE_SIZE, j++) {
        byteBuffer.put(i, (byte) 0);
        // force flush when flush disk type is sync
        if (type == FlushDiskType.SYNC_FLUSH) {
            if ((i / OS_PAGE_SIZE) - (flush / OS_PAGE_SIZE) >= pages) {
                flush = i;
                mappedByteBuffer.force();
            }
        }

        // prevent gc
        if (j % 1000 == 0) {
            log.info("j={}, costTime={}", j, System.currentTimeMillis() - time);
            time = System.currentTimeMillis();
            try {
                Thread.sleep(0);
            } catch (InterruptedException e) {
                log.error("Interrupted", e);
            }
        }
 }
アダムKotwasinsは次のとおりです。

それはしていません。

スレッドのスリープドキュメントは述べています:

指定されたミリ秒数のスリープに現在実行中のスレッド(一時的に実行を停止)、システムタイマーとスケジューラの精度と正確に被写体を引き起こします。スレッドには、任意のモニターの所有権を失うことはありません。

それが何を意味するのか、それを持つことができますガベージコレクタの動作に副作用を。

呼び出すことによってThread.sleep(0)、あなたは(潜在的に(実装はそれさえもを無視することができるように、それは、0だ))コンテキストの切り替え、並列GCスレッドがクリーンアップするために、代わりに選択することができている他の参照を。マイナーな副作用は、あなたがいることで、潜在的に防ぐことができるか-より頻繁にGCを実行して長時間実行ガベージコレクションを(あなたはすべての1000回の反復を実行するGCの機会が増加しています)。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=188244&siteId=1