所以我有这段代码:
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会增加?此时加载到内存中的是什么?
答案 0 :(得分:0)
分配的内存并不一定意味着对象占用的内存。它可以是空堆空间。
Java GCs正在复制/压缩收集器,为了复制工作,他们需要一些TO-space作为非垃圾的复制目的地。
通过强制垃圾收集,你干扰了GC的启发式方法,例如:具有暂停时间目标或吞吐量目标。为了弥补它,可能决定在配置的最大堆大小的范围内给自己更多的喘息空间 - 仍然可以达到这些目标。
我不知道它是否适用于所有GC算法,但使用-XX:+PrintAdaptiveSizePolicy
进行记录可能会提供一些见解。
答案 1 :(得分:-1)
您提出的问题无效。
您无法强制GC,任何内存消耗都完全是一个实现细节。 JVM可以做很多事情,所以问题完全无效。
在不同的计算机和JVM上,它的行为可能不同。