0

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

在此处输入图像描述

后续问题:我也可以假设它是由于对象序列化吗?也许是由 Terracotta ehcahce 触发的(来自第三行。不是因为它在 ByeArrayOS 旁边,因为在我们的代码中,这是唯一可以发生序列化的地方)?

4

2 回答 2

1

当您的缓存超出堆时,Ehcache 确实依赖于 Java 序列化。

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

于 2017-11-14T10:51:08.313 回答
0

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

所以,这相当于

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

线程持有 aByteArrayOutputStream并且它不能被垃圾收集,因为线程没有完成它。

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

您是否有可能将相当大的对象放入缓存中?正如@louis-jacomet 提到的,注意到了。

于 2017-11-14T17:01:00.753 回答