Работает ли сборщик мусора в Java автоматически? - PullRequest
0 голосов
/ 18 июня 2010

Мне нужно знать, работает ли сборщик мусора в Java самостоятельно или нам нужно его запустить.

Ответы [ 6 ]

4 голосов
/ 18 июня 2010

Работает сам по себе. Вы можете «предложить» запустить его, но это все.

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

GC - это поток deamon, который начинается с вашей JVM и заканчивается, когда ваша JVM заканчивается (JVM останавливается, если больше не существует потоков, не являющихся deamon).

Он работает в фоновом режиме и запускается в действие, когда / при необходимости. JVM решает, когда она будет запущена, и вы можете «запросить» ее запустить с помощью System.gc () .

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

На что вы можете рассчитывать, это то, что перед тем, как вы получите java.lang.OutOfMemoryError, GC включился в действие и сделал все возможное.

1 голос
/ 18 июня 2010

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

Вам следует прочитать это Старое Обсуждение SO по связанной теме.

0 голосов
/ 18 июня 2010

Единственный известный мне случай, когда вам нужно вызвать System.gc (), - это когда вы создаете много прямых байтовых буферов.Для кучи памяти OutOfMemoryError произойдет только после полного GC, однако для прямой памяти, если вы исчерпали (даже если могут быть буферы, на которые нет ссылок), GC не вызывается, поэтому вам, возможно, придется вызывать его самостоятельно допытаясь снова.

Я надеюсь, что это исправлено в будущих версиях Java.

0 голосов
/ 18 июня 2010

(Вероятно, это просто повторение того, что пытались сказать другие ответы ... Однако, стоит сказать это ясно .)

Сборщик мусора Java запускается автоматически по мере необходимости, и запускать его не нужно.

Существует статический метод (System.gc()), который приложение может вызвать запросом , чтобы сборщик мусора запустил «сейчас». Однако:

  • JVM можно настроить так, чтобы он не обращал внимания на этот запрос.
  • Как правило, плохая идея *1016* делать этот запрос, потому что это может значительно снизить производительность сборщика мусора. Вообще говоря, лучшее время для запуска сборщика мусора - когда нужно собрать много мусора, и только JVM знает, когда это может произойти.

EDIT - лекарство от больших задержек при сборке мусора заключается в изменении свойств сборщика мусора JVM для выбора сборщика с низкой задержкой. Вызов System.gc() не является способом справиться с этим в современной JVM.

0 голосов
/ 18 июня 2010

Да, сборка мусора автоматически выполняется Java.Когда объект больше не упоминается какой-либо переменной, Java автоматически освобождает память, используемую этим объектом.Это называется сборкой мусора.Тем не менее метод System.gc() метод может использоваться для его явного вызова.

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