当我使用 OpenJDK 11(Windows 10 上的 Zulu 发行版)编译并运行以下非常简单的 Java 程序时:
public class GCTest {
public static void main(String[] args) {
System.out.println("Free memory before garbage collection: " + Runtime.getRuntime().freeMemory());
Runtime.getRuntime().gc();
System.out.println("Free memory after garbage collection: " + Runtime.getRuntime().freeMemory());
}
}
看起来垃圾收集是减少可用内存量:
Free memory before garbage collection: 266881496
Free memory after garbage collection: 7772200
当我使用 Oracle 的 Java 8 运行它时,不会发生这种情况:
Free memory before garbage collection: 254741016
Free memory after garbage collection: 255795064
这是为什么?
答案是:Java 11 的 GC(当显式调用时,例如通过System.gc()
)可以减少Java进程使用的内存(在Java中称为totalMemory
).
在 Java 8 中,默认垃圾收集器无法减少 Java 进程的已用内存。 Java 进程占用的内存从未被释放。仅当您切换到G1GC
垃圾收集器(选项'-XX:+UseG1GC'
)Java 8能够减少Java进程使用的内存(如果你手动调用System.gc()
).
“空闲内存”是Java进程占用但当前未使用的内存。因此,如果执行垃圾回收并且 Java 占用的内存减少,则可用内存量也会减少。
因此,计算 Java 进程的“可用内存”的常用方法是使用
Runtime r = Runtime.getRuntime();
long free = r.maxMemory() - r.totalMemory() + r.freeMemory();
这种方式与Java进程当前占用的内存无关。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)