Terracotta EhCache - 并发修改在序列化期间创建巨大的字节数组

Terracotta EhCache - concurrent modification creates huge byte array during serialization

如果我的 heapdump Dominator Tree 视图如下所示,我可以假设我的堆的主要贡献者 (~1GB) 是由 Weblogic 创建的 Thread 实例吗?在该线程中,对 ByteArrayOutputStream 的引用是 1GB 的原因?

跟进问题:我也可以假设它是由于对象序列化造成的吗?可能由 Terracotta ehcahce 触发(从第三行开始。不是因为它在 ByeArrayOS 旁边,因为在我们的代码中这是唯一可以发生序列化的地方)?

Ehcache 确实依赖于 Java 缓存超出堆的那一刻的序列化。

但是,它只会序列化您放入缓存中的内容。那么是否有可能某些缓存映射具有如此巨大的价值甚至关键?

Dominator 树表示您有一个 Weblogic 线程持有 ByteArrayOutputStream(和一个 SerializerObjectOutputStream)。 Weblogic 线程是当前正在处理请求的经典工作线程。它目前卡在某物上。

所以,这相当于

ByteArrayOutputStream in = new ByteArrayOutputStream();
Thread.wait();

该线程持有一个 ByteArrayOutputStream 并且无法对其进行垃圾回收,因为该线程尚未完成它。

看到序列化程序让我觉得您目前正在从 Ehcache 磁盘或堆外反序列化。

您是否可能在缓存中放置了相当大的对象?正如@louis-jacomet 提到的那样注意到了。