我正在使用ExecutorService使用50个线程加载5000个缓存对象来测试Guava缓存的性能。我想看看被缓存的对象占用的堆。为什么闲置的Java应用程序在4分钟内生成20 MB垃圾?
它看起来好像缓存的对象吃了25MB。
后来,我把了Thread.sleep在主线程睡眠应用10分钟,这样我就可以品尝内存等
出人意料的是,即使在应用程序处于睡眠,它产生20MB的垃圾每4分钟一次。由于每4分钟有一次GC操作,因此在使用的堆图中会看到一个锯齿波。
为什么java在空闲应用程序中每分钟生成5MB垃圾?
UPDATE: 我跑了一个主要方法,只需要调用Thread.sleep 10分钟。
内存分配是每分钟4 MB。
下面是内存采样器截图。 看起来只是引起所有活动的RMI TCP连接线程。
这只是事实,我们正在观察与VisualVM导致所有的活动?或者它是常规的jvm活动?
当主线程睡着时,9个守护进程线程在做什么? –
更重要的是,最好不要关心这些细节。有些线程在某处运行一些预定的代码或类似代码,并且每秒创建80 KB垃圾。它可能是与VisualVM通信的线程。这对你的应用程序的整体行为没有影响。 –
ExecutorService 50个线程在3:28 pm完成并被终止。 JVM本身有10个守护进程线程。应用程序只有1个活动的非守护线程。那一条线睡着了〜10分钟。 – Teddy