为什么Thread.sleep(0)可以防止rocketmq中的gc?

Why Thread.sleep(0) can prevent gc in rocketmq?

最近看了RocketMQ的源码,但是看不懂这段代码。为什么这段代码可以防止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);
            }
        }
 }

没有。

线程的睡眠文档仅说明:

Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds, subject to the precision and accuracy of system timers and schedulers. The thread does not lose ownership of any monitors.

这意味着什么 会对垃圾收集器的行为产生副作用。

通过调用 Thread.sleep(0),您(可能(它是 0,因此实现甚至可以忽略它))切换上下文,并且可以选择并行 GC 线程来清理 其他 参考文献。 次要的副作用是你 potentially 运行 GC 更频繁 - 什么可以防止 long-运行ning 垃圾收集(您每 1000 次迭代增加 GC 运行 的机会)。