Периодическая сборка мусора помогает производительности JVM? - PullRequest
1 голос
/ 26 февраля 2011

Я только что столкнулся со следующим кодом (слегка упрощенным):

/* periodically requests garbagecollect to improve memory usage and 
   garbage collect performance under most JVMs */
static class GCThread implements Runnable {
    public void run() {
        while(true) {
            try {
              Thread.sleep(300000);
            } catch (InterruptedException e) {}
            System.gc();           
        }
    }
}

Thread gcThread = new Thread(new GCThread());
gcThread.setDaemon(true);
gcThread.start();

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

Это правда? Это очень противоречит моей интуиции, что этот маленький взломщик должен что-то улучшить. Я ожидаю, что JVM будет гораздо лучше оснащена, чтобы решить, когда выполнять коллекцию.

Код выполняется в веб-приложении, работающем внутри IBM WebSphere в Z / OS.

Ответы [ 3 ]

4 голосов
/ 26 февраля 2011

Это зависит.

  1. JVM может полностью игнорировать System.gc(), поэтому этот код не может делать абсолютно ничего.

  2. Во-вторых, GC оказывает влияние на стоимость. Если ваша программа в противном случае не выполнила бы сборку мусора (скажем, она не генерирует много мусора, или у нее огромная куча, и она не нуждается в сборке мусора), тогда этот код будет добавлен.

  3. Если программа обычно запускается только с небольшими GC, и этот код вызывает серьезный GC, вы окажете отрицательное влияние.

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

4 голосов
/ 26 февраля 2011

Я тоже разделяю ваше предположение. Если это действительно оптимизация, она нашла бы свой путь в JVM. Следует избегать вызова сборщика мусора - он может даже иметь отрицательный эффект (потому что вы «мешаете» JVM)

JVM, вероятно, будет иметь настройку для интервала gc. Смотрите здесь для ВС. А жесткое кодирование значения довольно сомнительно для всего, особенно для сборки мусора.

1 голос
/ 27 февраля 2011

Может быть было бы неплохо, если бы ваше приложение могло рассчитывать время вызовов так, чтобы GC происходил в то время, когда приложение не имеет ничего полезного, поэтому память чиста всякий раз, когда наступает следующий пик загрузки , Но это не то, что делает этот цикл (он просто работает все 5 минут), поэтому я бы посоветовал против этого.

Но я приглашаю вас проверить его - запустите приложение с и без этого цикла для аналогичных объемов работы и измерения, которые занимают больше времени (и, возможно, общего объема памяти, если это важно). Повторите тест несколько раз. Может быть, мы получили некоторые удивительные идеи.

...