如果我的 heapdump Dominator Tree 视图如下所示,我可以假设我的堆的主要贡献者(~1GB)是 Weblogic 创建的 Thread 实例吗?在那个线程中,对 ByteArrayOutputStream 的引用是 1GB 的原因吗?
后续问题:我也可以假设它是由于对象序列化吗?也许是由 Terracotta ehcahce 触发的(来自第三行。不是因为它在 ByeArrayOS 旁边,因为在我们的代码中,这是唯一可以发生序列化的地方)?
如果我的 heapdump Dominator Tree 视图如下所示,我可以假设我的堆的主要贡献者(~1GB)是 Weblogic 创建的 Thread 实例吗?在那个线程中,对 ByteArrayOutputStream 的引用是 1GB 的原因吗?
后续问题:我也可以假设它是由于对象序列化吗?也许是由 Terracotta ehcahce 触发的(来自第三行。不是因为它在 ByeArrayOS 旁边,因为在我们的代码中,这是唯一可以发生序列化的地方)?
当您的缓存超出堆时,Ehcache 确实依赖于 Java 序列化。
但是,它只会序列化您放入缓存中的内容。那么是否有可能一些缓存的映射具有如此巨大的价值甚至键?
Dominator 树是说你有一个 Weblogic 线程持有一个ByteArrayOutputStream
(和一个 SerializerObjectOutputStream)。Weblogic 线程是当前处理请求的经典工作线程。它目前卡在某事上。
所以,这相当于
ByteArrayOutputStream in = new ByteArrayOutputStream();
Thread.wait();
线程持有 aByteArrayOutputStream
并且它不能被垃圾收集,因为线程没有完成它。
看到序列化程序让我觉得您当前正在从 Ehcache 磁盘或堆外反序列化。
您是否有可能将相当大的对象放入缓存中?正如@louis-jacomet 提到的,注意到了。