Подтвердить что ты не робот

Вызов System.gc() явно?

Говорят, что мы не можем заставить процесс garbage collection в java.
Это, в конце концов, поток демона.

Но иногда, почему мы называем функцию System.gc( ); явно?
Стоит ли его называть? Любые Pro и Con?
Если это не полезно во многих ситуациях, почему этот метод не устарел от Java?

PS: Объяснение с примером будет полезно

4b9b3361

Ответ 1

Лучший способ, на мой взгляд, думать о методе System.gc() - это "подсказка" для виртуальной машины, которую должна запускать сборка мусора. Тем не менее, как и большой процент "оптимизаций", люди думают, что они выступают, обычно лучше всего позволить системе самостоятельно заботиться о вещах. Системы развиваются и т.д. И т.д. И т.д. Есть еще некоторые примеры, когда разработчик может на самом деле знать лучше, и вариант использования для него, вероятно, очень похож на то, почему какой-то код все еще написан на сборке (в большинстве случаев, компилятор лучше, но в некоторых случаях - или с несколькими разработчиками - люди могут писать более эффективный код).

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

Ответ 2

Вы ответили наполовину на свой вопрос: стоит ли это? Нет, потому что вы не можете заставить его.

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

Это почти EULA-английский для "вы можете попробовать, но мы оба знаем результат".:)

Кроме того, серверы приложений могут (и часто будут) отключать его с помощью командной строки -XX:-DisableExplicitGC.

И что тогда тогда? Ну, может быть одно: некоторые приложения любят отображать объем свободной памяти, доступный в куче, и перед обновлением вашего дисплея может быть полезно использовать System.gc(); до этого.

Ответ 3

Q: почему мы называем System.gc(); функция явно?

A: Потому что кто-то написал плохой код.

Я думаю, что большинство людей согласятся, что вы не должны явно называть System.gc().

Пусть система управляет памятью, как предполагалось. Любой код, полагающийся на то, что для производительности, скорее всего, нарушен. Также имейте в виду, что JVM может полностью игнорировать ваш запрос.

Если вам нужна дополнительная информация, я бы предложил прочитать ответы:

java - почему это плохая практика для вызова System.gc?

Ответ 4

При вызове System.gc() полезно:

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

Там может быть больше случаев использования, однако, вы ничего не можете ожидать в ближайшее время. Большую часть времени лучше позволить ему сделать свою работу.

Ответ 5

Не намереваясь ответить на вопрос, явным образом вызываю сборщик мусора, это плохая, плохая практика, однако какой-то код в java действительно полагается на финализацию... и пытается обеспечить его соблюдение. Вызов полезен в некоторых сценариях профилирования. Ни один стандартный JVM не игнорирует System.gc(). Конечно, он может быть отключен. Тем не менее, b/c в сторону памяти сборщик мусора управляет ссылками Java на внешние ресурсы, это может потребоваться.

вот какой-то код из java.nio.Bits

static void reserveMemory(long size) {

    synchronized (Bits.class) {
        if (!memoryLimitSet && VM.isBooted()) {
            maxMemory = VM.maxDirectMemory();
            memoryLimitSet = true;
        }
        if (size <= maxMemory - reservedMemory) {
            reservedMemory += size;
            return;
        }
    }

    System.gc();
    try {
        Thread.sleep(100);
    } catch (InterruptedException x) {
        // Restore interrupt status
        Thread.currentThread().interrupt();
    }
    synchronized (Bits.class) {
        if (reservedMemory + size > maxMemory)
            throw new OutOfMemoryError("Direct buffer memory");
        reservedMemory += size;
    }

Сон необходим для того, чтобы финализация выполнялась на самом деле (или попытка прогона), Cleaners обычно имеют ускоренную последовательность в потоке финализатора с высоким приоритетом.

Ответ 6

О какой версии Java мы говорим здесь? В 6 я бы никогда не назвал это явно. Как правило, сборщик мусора достаточно хорош, чтобы знать, когда лучше всего очищать ресурсы, и у него есть достаточно настраиваемые параметры VM. Я, конечно, никогда не чувствовал необходимости называть его кодом, и я бы сказал, если бы вы не делали что-то действительно странное (или показывали использование ресурсов), лучше всего этого не делать. Если вы чувствуете необходимость называть это, я бы сказал, что вы сделали что-то плохое или неправильное в другом месте.

Если мы говорим о работе с Java 1.4 или раньше, иногда я нахожу, что ей нужна помощь. Никаких примеров, чтобы вручить (извините), но я помню, что мне нужно было наброситься на него, чтобы избежать ужасного запаздывания, когда он решил в конце концов вбить. С тем же кодом на 6 проблема исчезла, и ее вызвали мало или не имели разницы.

Конечно, когда вы вызываете System.gc(), все, что вы на самом деле делаете, предлагает виртуальной машине, которая теперь может быть подходящим временем для запуска сборщика мусора. Это не значит, что это действительно так, это просто предположение, что вполне допустимая реализация VM может полностью игнорировать. Фактически существует даже опция DisableExplicitGC, которая означает, что эти вызовы определенно не будут влиять (и с этой опцией запускается много кода в производственных средах.)

Итак, да, он по-прежнему используется в коде, но в подавляющем большинстве случаев это не очень хорошая практика.

Ответ 7

Явным образом это anti-pattern to use System.gc(), хотя мы используем его, чтобы предлагать JVM для подметания мусора, но это зависит от JVM независимо от того, будет оно или нет, оно также накладывает некоторые критерии, на которые он смотрит, когда происходит System.gc(). Если критерии следуют, то действует; иначе нет.

Ответ 8

It is said that we cannot force the garbage collection process in java.

Это очень популярное убеждение, которое совершенно неверно.

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

Таким образом, вера является одновременно популярной и неправильной. Что менее популярно, так это знание того, как вы на самом деле запускаете такой GC, как показывает уникальный (и очень неопределенный) ответ на мой +6 раз повышенный вопрос:

Java: Как вы действительно заставляете GC использовать JVMTI ForceGargabeCollection?