为什么空闲Java应用程序在4分钟内生成20 MB垃圾?

我使用ExecutorService通过使用50个线程在缓存中加载5000个对象来测试Guava缓存的性能。 我想看看被缓存的对象占用的堆。

它看起来好像缓存的对象吃了25MB。

后来,我在主线程中放置了一个Thread.sleep,让应用程序休眠10分钟,以便我可以对内存进行采样等。

令人惊讶的是,即使应用程序处于睡眠状态,它也会每4分钟产生20MB的垃圾。 由于每4分钟有一次GC操作,因此在使用的堆图中会看到一个锯齿波。 在这里输入图像描述

为什么java在空闲应用程序中每分钟生成5MB垃圾?

更新 :我只运行一个主要方法,只需要调用Thread.sleep 10分钟。

内存分配是每分钟4 MB。 在这里输入图像描述

以下是内存采样器截图。 看起来像只有导致所有活动的RMI TCP连接线程。 在这里输入图像描述

仅仅是因为我们正在用VisualVM观察导致所有这些活动的事实吗? 或者它是常规的jvm活动?


作为底线:没有人可以回答这样的问题,而不需要分析你的应用程序。 你需要的是在可视VM中获取内存快照,并检查哪些类正在占用大量内存。 此外,它有助于对对象计数进行排序,并查看在GC之前和之后哪些对象的实例数变化最大。

对于一个快速的glimipse,由于你的pic中有11个线程显示,至少你有一些Runnable对象的节点对象提交给你的ExecutorService ,大多数当前的Java库和packge都会选择这些对象。


您正在使用VisualVM监视您的应用程序。 VisualVM使用JMX / MBeans来获取监视信息。 JMX使用RMI作为传输层。 VisualVM定期轮询MBeans,这会转化为通过RMI调用在JVM上运行的服务。

每分钟4MB的声音对于VisualVM来说是合理的数字。

我建议你监视你使用SJK ttop命令进行处理。 它显示了每个线程的内存分配率,因此您可以验证是否所有垃圾都可以归因于RMI线程,或者您的任何应用程序线程都会乱丢垃圾。

链接地址: http://www.djcxy.com/p/79961.html

上一篇: Why does idle Java application generate 20 MB garbage in 4 minutes?

下一篇: Heap dump in visualvm glassfish