我正在使用访问直接内存的 Apache Arrow Java API。
我也在使用 Redis,当这个 Java API 访问直接内存时,Redis xstream 在内存中继续增长。
我偶尔发现,Arrow 会计算以下操作的错误结果,
public static int bytesToInt(byte[] bytes) {
return ((bytes[3] & 255) << 24) +
((bytes[2] & 255) << 16) +
((bytes[1] & 255) << 8) +
((bytes[0] & 255));
}
此方法返回否定结果并且以下代码引发错误
messageLength = MessageSerializer.bytesToInt(buffer.array());
ByteBuffer.allocate(messageLength);
我发现如果我重新启动 Redis(删除所有以前的数据),错误会消失一段时间。如果没有,当我调用 Arrow 方法时,错误会更快发生。
重现至关重要,以我的经验,Arrow 直接内存访问应该很频繁,并且 redis xstream 增长应该足够快。
所以我不是要完全重现和解决问题,而是要问这两个内存访问是否可能发生冲突?上述结果是否有合理的理论支持?