什么是GC收集在这里?

时间:2010-08-05 16:44:57

标签: java garbage-collection

这可能是非常基本的,但非常好奇。 这是代码片段和输出

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次

,它也会得到完全相同的结果

1 个答案:

答案 0 :(得分:9)

在大多数JVM实现中,main方法实际上并不是JVM启动期间运行的第一段Java代码。

通常,完整JRE的许多部分本身都是用Java实现的。例如,类加载器机制的很大一部分是用纯Java实现的。它甚至可以用Java编写垃圾收集算法本身的一部分。

由于这个原因,即使您的应用程序根本没有创建垃圾,gc也可以收集这些系统类中的一些垃圾。

顺便说一下,你的应用程序在调用System.gc()时创建了至少一个符合垃圾收集条件的对象:提到可用内存的String是动态构建的,而不是保存在一个变量,所以它可以在System.gc()调用期间进行gc编辑。