シュトゥーベン:
最近、私はRocketMQでソースコードを読んで、私はこのコードを理解can`t。なぜ、このコードは、GCを防ぐことができますか?
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の機会が増加しています)。