Что GC собирает здесь? - PullRequest
       1

Что GC собирает здесь?

8 голосов
/ 05 августа 2010

Это может быть довольно просто, но было очень любопытно узнать.Вот фрагмент кода и выходные данные

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 Ответ

9 голосов
/ 05 августа 2010

В большинстве реализаций JVM метод main на самом деле не является первым фрагментом кода Java, который выполняется во время запуска JVM.

Обычно многие части полной JRE сами реализуются в Java.Например, большая часть механизма загрузчика классов реализована на чистом Java.Возможно, он даже сможет писать части самого алгоритма сборки мусора в Java.

Из-за этого, возможно, уже есть некоторый мусор из тех системных классов, которые может собирать gc, даже если ваше приложение не создавало мусораall.

Кстати, ваше приложение создает по крайней мере один объект, который подходит для сборки мусора в точке, где вызывается System.gc(): String, в котором упоминается свободная память, создается динамически и не удерживаетсяв переменной, так что он вполне может быть скопирован во время вызова System.gc().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...