java - 为什么一个空的 Java 程序会消耗内存?

标签 java memory-leaks while-loop

我正在探索 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 运行时环境(内部版本 1.6.0_29-b11)

Java HotSpot(TM) 客户端虚拟机(build 20.4-b02,混合模式,共享)

操作系统:Windows 7 Enterprise-32 位

最佳答案

Why is there still a saw tooth pattern?

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

Why when the GC runs does it not save all the memory (each time the gc runs (the valleys) the used memory increases by 10-20Kb (compared to the previous valley))?

我相信监视器在垃圾收集后不会立即看到已使用的内存量,而是必须经常轮询以查看内存使用情况。因此,感知到的“谷”必然比真正的谷要高一些。我猜测在山谷中感知到的内存使用量增加只是这种差异的随机产物,并且会随着时间的推移而被抵消。 (也就是说,我认为每个周期实际上不会发生 10-20 KB 的内存泄漏。)

关于java - 为什么一个空的 Java 程序会消耗内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8361902/

相关文章:

java - 如何判断数组值的序列是否是回文?

java - 如果里面 while

java - Spring Data Rest 使用一个 CRUD 存储库管理所有实体

java - RESTEasy JAX-RS 应用程序未调用 @PreDestroy

android-studio - Android Studio 内存监视器显示内存增加

c - `setjmp` 和 `longjmp` 的安全使用

HTML5 getImageData 的 javascript 内存泄漏

javascript - 同时在循环中运行函数

c# - 在 C# 中的计时器滴答声中的序列

java - 用gradle获取特定的Jar