System.gc проблема - PullRequest
       1

System.gc проблема

2 голосов
/ 18 июня 2011

Я использую алгоритм планирования с фрагментом сборки мусора, который выглядит следующим образом:

    //garbage collection
    if (state.children.isEmpty()) {//if this is a leaf node (no children)
        state.parent.children.remove(state);
        System.gc();
    }

Сначала алгоритм работает плавно, без пауз;но через некоторое время, когда дерево начинает расти, возникает некоторая пауза в каждом gc.

Так что я подумал, может быть, вызываемый gc реже?И изменил мой код следующим образом:

    //garbage collection
    if (state.children.isEmpty()) {//if this is a leaf node (no children)
        state.parent.children.remove(state);
        if(index % 10000)
            System.gc();
    }

Но, похоже, на самом деле это не приводит к какой-либо очистке, моя программа в любом случае вызвала бы исключение outOfMemory.

Как мне реализовать мой сборщик мусораправильно, чтобы не вызывать слишком много раз?

Ответы [ 2 ]

3 голосов
/ 18 июня 2011

Вам вообще не нужно явно вызывать сборщик мусора. Это очень редко уместно, но я обычно был бы довольно подозрительным, если бы вы нашли, что это вам нужно.

Вы пытались запустить с включенным подробным ведением журнала GC? Поначалу может быть неловко понимать, но это должно показать вам, что происходит. Я не был бы удивлен, обнаружив, что на самом деле у вас где-то есть утечка, и просто благодаря GC-ing на каждой итерации вы настолько замедлили свою программу, что вы просто не достигли точки, в которой это кусается.

Сколько памяти выделено для виртуальной машины? Изменение настроек памяти (и даже настроек GC) может оказать большое влияние на некоторые рабочие нагрузки.

2 голосов
/ 18 июня 2011

Пауза, вероятно, происходит сборка мусора. Как упоминает Фредерик, вы уверены, что должны вызывать GC вручную? Как правило, вам не нужно. Если вас беспокоит использование памяти, не стесняйтесь чаще сокращать дерево, но позвольте GC определить, когда его запускать, и не вызывайте его вручную.

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

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