为什么空的 Java 程序会消耗内存?

2022-09-04 04:57:21

我正在探索Java中的内存使用情况,以了解为什么我的程序会泄漏内存。在我的主 while 循环中剥离代码后,随着时间的推移,我仍然会得到内存使用量的增加。考虑空程序的内存使用情况:

class Nothing
{    public static void main(String[] args)
     {    while(true);    }
}

我仍然看到记忆力的增加:

Image description here

所以我的问题是:为什么还有锯齿图案?为什么当GC运行时,它不保存所有内存(每次gc运行(谷值)时,使用的内存增加10-20Kb(与之前的谷值相比))?

编辑:

java 版本 “1.6.0_29”

Java(TM) SE Runtime Environment (build 1.6.0_29-b11)

Java HotSpot(TM) Client VM (build 20.4-b02, 混合模式, 共享)

操作系统:Windows 7 Enterprise-32位


答案 1

为什么还有锯齿图案?

如果我没有记错的话,部分原因是监视器本身强制应用程序创建包含有关垃圾回收状态和内存使用情况信息的临时对象。

为什么当GC运行时,它不保存所有内存(每次gc运行(谷值)时,使用的内存增加10-20Kb(与之前的谷值相比))?

我相信监视器不会立即看到垃圾回收后已用内存量,而是必须经常轮询才能看到内存使用情况。因此,感知到的“谷”必然比真正的谷值高一些。我猜想,山谷中内存使用量的感知增加只是这种差异的随机伪影,并且会随着时间的推移而中和。(也就是说,我不认为每个周期实际上有10-20 KB的内存泄漏。


答案 2

这是探查器的项目,如果没有探查器,则不会有分配。不同的探查器会产生不同的工件,具体取决于它们记录数据的方式。下面你可以看到JProfiler的分析是什么样的:Nothing

enter image description here

少了太多的锯齿图案。但是,内存消耗也很小:

enter image description here

这是因为分析代理轮询 JMX Bean。最终,这种消耗也会触发垃圾回收。java.lang.management.MemoryUsage


推荐