Вызов System.gc () из YourKit приводит к увеличению выделенной памяти - PullRequest
0 голосов
/ 18 сентября 2018

Я собираюсь начать использовать стороннюю библиотеку с закрытым исходным кодом для загрузки группы данных и хотел проверить, насколько она быстра и сколько памяти требуется для загрузки одного «набора» данных.Я написал этот простой способ, чтобы вызвать загрузку данных и рассчитать его, и использовал YourKit, чтобы быстро взглянуть на использование памяти и вникнуть во время процессора.

Я запускаю его на Windows 7, используя Eclipse на JDK8 без аргументов виртуальной машины.

public static void main(String[] args){
    long start = System.currentTimeMillis();

    // There are a few more calls involved, but not much
    BlackBoxDataProvider bd = new BlackBoxDataProvider("c:\\thedata");
    BlackBoxData = bd.loadTheData();
    System.out.println(System.currentTimeMillis() - start + "ms");

    // Keep the application alive so I can have a quick look at memory usage
    while(true) {
        Thread.sleep(1000);
    }
}

Вот снимок памяти YourKit после завершения загрузки:

enter image description here

Затем я использовал YourKit для «принудительной» сборки мусора, и это произошло:

enter image description here

Очевидно, что это не реальный сценарий, потому что я застрял в методе main, в главном потоке, поэтому некоторые из моих ссылок не будут очищены, но я не могу понять, почему выделение памяти будет увеличиваться.

Каждый раз, когда я нажимаю «Force System GC», распределение увеличивается.Я получил 11,9 ГБ, прежде чем он прекратил увеличиваться.

enter image description here

Почему это происходит?

1 Ответ

0 голосов
/ 18 сентября 2018

System.gc () вернется, когда все объекты будут проверены один раз.Если объекты, реализующие метод finalize (), добавляются в очередь, для последующей очистки.Это означает, что эти объекты еще не могут быть очищены (а не узлы очереди, которые их содержат), т. Е. Запуск GC может временно увеличить потребление памяти.Это то, что может происходить в вашем случае.

Короче говоря, не все объекты можно очистить за один цикл.

...