开发者社区> 问答> 正文

关于max memory size的问题

在类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

展开
收起
绿子直子 2023-05-09 16:05:40 121 0
2 条回答
写回答
取消 提交回答
  • putMemSize.get() - ackMemSize.get(), 这个得出来的结果就是当前在内存中未被get的数据,也就是使用中的内存块,因为Ringbuffer的特性是lazy set模式,在几个位点之间会有部分内存数据未被及时清理,不过一般在数据高速get/put过程中,总的内存量是可控的,并不是非常精确

    原回答者GitHub用户agapple

    2023-05-10 11:05:45
    赞同 展开评论 打赏
  • 如果仅仅判断 memsize < bufferSize * bufferMemUnit 存在一个问题,因为应该考虑到当前空闲内存量和即将加入的事件占用的内存量。

    事实上,在类 MemoryEventStoreWithBuffer 中的 checkFreeSlotAt 方法中,使用的计算方式是正确的。这是因为在该方法中,putMemSize 变量记录了已经分配的内存大小,而 ackMemSize 变量记录了已经被确认的内存大小,因此 (putMemSize.get() - ackMemSize.get()) 即表示当前未被确认的内存大小。

    在加入新事件时,需要再加上新事件的大小,然后和 bufferSize * bufferMemUnit 进行比较,如果小于等于 bufferSize * bufferMemUnit 则表示还有空闲的内存空间可以使用,否则就需要清除一些已经被确认的事件释放内存空间。

    具体来说,当 batchMode.isMemSize() 返回 true 时,表示当前的内存容量达到了最大限制,此时需要动态地释放内存用于新事件的加入。而在 batchMode.isMemSize() 返回 false 的情况下,表示当前使用的是固定的内存缓冲区大小,因此不需要进行动态内存管理。

    总之,类 MemoryEventStoreWithBuffer 中的 checkFreeSlotAt 方法使用了正确的计算方式,可以正确地判断当前是否有足够的内存空间用于新事件的加入。

    2023-05-10 08:43:55
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载