我们有一个OutOfMemory(堆)的怪异案例。有了这种方法
private void processRemainingIds(final ITransaction tx) {
remainingIds.stream()//
.map(this::getInternalMessage)//
.filter(this::isMessageNeedsProcessing)//
.forEach(msg -> registerMessageAsMissing(msg,tx));
}
如果剩余Ids足够大,则此方法会相当稳定地填充堆。
-
getInternalMessage
将加载“正常”大小的数据模型结构(即,没有blob / clob等,只有几十个字符串和数字) -
registerMessageAsMissing
内部调用一个同步方法(也许是相关的) - 使
getInternalMessage
“同步”完全改变了内存行为,堆大小不再增加
我希望上面的实现会创建很多内部消息,检查并在需要时对其进行处理,但是随后丢弃每个对象并偶尔运行GC。但这不是我们所看到的,相反,我们得到了
OOM的标准问题,即我熟悉的是“某些东西在固定住您的对象”。但是,为什么使getInternalMessage
同步会发生任何变化?