在类MemoryEventStoreWithBuffer的checkFreeSlotAt方法中, if (batchMode.isMemSize()) { final long memsize = putMemSize.get() - ackMemSize.get(); if (memsize < bufferSize * bufferMemUnit) { return true; } else { return false; } } else { return true; } 只判断memsize < bufferSize * bufferMemUnit还不够吧,应该用 ”当前空闲内存量+新加入事件所占内存量”和bufferSize * bufferMemUnit进行比较才对吧?? 望指教。
原提问者GitHub用户lulu2panpan
putMemSize.get() - ackMemSize.get(), 这个得出来的结果就是当前在内存中未被get的数据,也就是使用中的内存块,因为Ringbuffer的特性是lazy set模式,在几个位点之间会有部分内存数据未被及时清理,不过一般在数据高速get/put过程中,总的内存量是可控的,并不是非常精确
原回答者GitHub用户agapple
如果仅仅判断 memsize < bufferSize * bufferMemUnit 存在一个问题,因为应该考虑到当前空闲内存量和即将加入的事件占用的内存量。
事实上,在类 MemoryEventStoreWithBuffer 中的 checkFreeSlotAt 方法中,使用的计算方式是正确的。这是因为在该方法中,putMemSize 变量记录了已经分配的内存大小,而 ackMemSize 变量记录了已经被确认的内存大小,因此 (putMemSize.get() - ackMemSize.get()) 即表示当前未被确认的内存大小。
在加入新事件时,需要再加上新事件的大小,然后和 bufferSize * bufferMemUnit 进行比较,如果小于等于 bufferSize * bufferMemUnit 则表示还有空闲的内存空间可以使用,否则就需要清除一些已经被确认的事件释放内存空间。
具体来说,当 batchMode.isMemSize() 返回 true 时,表示当前的内存容量达到了最大限制,此时需要动态地释放内存用于新事件的加入。而在 batchMode.isMemSize() 返回 false 的情况下,表示当前使用的是固定的内存缓冲区大小,因此不需要进行动态内存管理。
总之,类 MemoryEventStoreWithBuffer 中的 checkFreeSlotAt 方法使用了正确的计算方式,可以正确地判断当前是否有足够的内存空间用于新事件的加入。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。