这可能是非常基本的,但非常好奇。 这是代码片段和输出
public class PlainSystemGC {
public static void main(String ...strings) {
System.out.println("Free Memory (Before GC): " + Runtime.getRuntime().freeMemory());
System.gc();
System.out.println("Free Memory (After GC): " + Runtime.getRuntime().freeMemory());
}
}
和输出
Free Memory (Before GC): 1859640
Free Memory (After GC): 1911768
我很想知道GC收集的内容,因为没有创建任何对象。
被释放的记忆是什么? (那太52kb)
@JSauer - 即使运行100次
,它也会得到完全相同的结果答案 0 :(得分:9)
在大多数JVM实现中,main
方法实际上并不是JVM启动期间运行的第一段Java代码。
通常,完整JRE的许多部分本身都是用Java实现的。例如,类加载器机制的很大一部分是用纯Java实现的。它甚至可以用Java编写垃圾收集算法本身的一部分。
由于这个原因,即使您的应用程序根本没有创建垃圾,gc也可以收集这些系统类中的一些垃圾。
顺便说一下,你的应用程序在调用System.gc()
时创建了至少一个符合垃圾收集条件的对象:提到可用内存的String
是动态构建的,而不是保存在一个变量,所以它可以在System.gc()
调用期间进行gc编辑。