为什么强制垃圾收集会增加分配给java进程的内存?

所以我有这个代码:

public static void main(String[] args) throws Exception { Thread.sleep(5000); System.out.println("Creating array..."); Integer[] integers = new Integer[Integer.MAX_VALUE/32]; Thread.sleep(5000); System.out.println("Destroying array"); integers = null; //System.gc (); //System.runFinalization (); Thread.sleep(60000); } 

当我运行这段代码后,我会在大约5秒钟后看到268 MB的ram被分配给Activity Monitor中的java进程。

当我在控制台中看到“销毁arrays”后取消注释注释行(System.gc和以下行)时,分配的内存增加到278 MB。

我可以理解内存没有被释放,因为System.gc()只是对JVM的一个暗示,但为什么10MB会增加呢? 此时加载到内存中的是什么?

分配的内存不一定意味着对象占用的内存。 它可以是空堆空间。

Java GCs正在复制/压缩收集器,为了复制工作,他们需要一些TO空间作为非垃圾的复制目的地。

通过强制垃圾收集,您正在干扰GC的启发式方法,例如其暂停时间目标或吞吐量目标。 为了补偿它,可以决定在配置的最大堆大小的范围内给自己更多的喘息空间 – 仍然满足这些目标。

我不知道它是否适用于所有GC算法,但使用-XX:+PrintAdaptiveSizePolicy记录可能会提供一些见解。

你问的是一个无效的问题。

您不能强制GC,任何内存消耗都完全是一个实现细节 。 JVM可以做很多事情,所以问题完全无效。

在不同的机器和JVM上,它可能表现不同。