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

时间:2018-11-13 15:13:27

标签: java garbage-collection 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);
            }
        }
 }

1 个答案:

答案 0 :(得分:4)

不是。

仅线程的睡眠文档说明:

  

使当前正在执行的线程在指定的毫秒数内进入睡眠状态(暂时停止执行),这取决于系统计时器和调度程序的精度和准确性。该线程不会失去任何监视器的所有权。

这可能对垃圾收集器的行为产生副作用。

通过调用Thread.sleep(0),您(可能(它为0,因此实现甚至可以忽略它))切换上下文,并且可以选择并行GC线程来清理 other 参考。 较小的副作用是您潜在地更频繁地运行GC-这可以防止长时间运行垃圾收集(您增加了每1000次迭代运行GC的机会)。< / p>