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

标签 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 秒后,我将在 Activity 监视器中看到 268 MB 的 RAM 被分配给 java 进程。

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

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

最佳答案

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

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

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

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

关于java - 为什么强制垃圾收集会增加分配给 java 进程的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28380208/

相关文章:

java - native 内存与 Java 应用程序内存

java - 使用 Jsch Java API 获取远程系统时间戳

java - TreeMap 放置 100 个元素(每个 1MB),而堆只有 80 MB 内存,这种情况下的行为是什么?

java - 在 UI 线程和后台网络线程之间交换消息

c - 首先返回比free char值c

python - netcdf 文件中数组的压缩

c - 在 Solaris 10 上从 C 获取 CPU 使用率统计信息

java - 我是否需要扩展 ClassLoader 来重定向 Web 应用程序资源加载?

php - 防止 GD 图像库内存不足的故障安全方法? (PHP)

ios - iOS 应用程序的理想内存使用量