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

时间:2015-02-07 08:44:21

标签: java memory memory-management garbage-collection jvm

所以我有这段代码:

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进程。

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

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

2 个答案:

答案 0 :(得分:0)

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

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

通过强制垃圾收集,你干扰了GC的启发式方法,例如:具有暂停时间目标或吞吐量目标。为了弥补它,可能决定在配置的最大堆大小的范围内给自己更多的喘息空间 - 仍然可以达到这些目标。

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

答案 1 :(得分:-1)

您提出的问题无效。

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

在不同的计算机和JVM上,它的行为可能不同。