在log4j2的异步日志记录器中,官方文档链接
log4j2.asyncLoggerConfigRingBufferSize
的默认值是 256 * 1024
这里的 256
和 1024
表示什么意思?
3 % 4 = 3
4 % 4 = 0
5 % 4 = 1
...
这样做是可行的,但我们可以做得更好。模运算适用于任何数组大小,但我们选择2的幂作为数组大小有一个原因:位掩码!位掩码可以实现相同的功能,但速度要快得多(约快25倍)。
这是如何工作的?如果数组是2的幂次方,通过减去1,我们可以得到它的位掩码。然后在从数组中获取值时使用此掩码:value = array[index & mask];
对于4来说,位掩码是4-1=3。3的二进制表示是11
。让我们看一下之前的示例:
0011 & 0011 = 0011 (3 & 3 = 3)
1000 & 0011 = 0000 (4 & 3 = 0)
1001 & 0011 = 0001 (5 & 3 = 1)
...
因此,这与取模的效果相同,但速度更快。再次强调,关键点是数组必须是2的倍数。
回到问题:环形缓冲区中实际插槽的数量为262144
。文档说明256 * 1024
以澄清它是2的幂。