Сборка мусора Java - PullRequest
       1

Сборка мусора Java

36 голосов
/ 23 февраля 2011

Java автоматически вызывает сборщик мусора, тогда зачем нам ручные вызовы для сбора мусора?Когда следует использовать System.gc ()

Ответы [ 7 ]

43 голосов
/ 23 февраля 2011

Java автоматически вызывает сборщик мусора, тогда зачем нам ручные вызовы для сбора мусора?

Нам они не нужны.Действительно, в большинстве случаев вызов System.gc() является вредным для производительности приложения .См. Мой ответ на «Почему плохая практика вызывать system gc» для подробного объяснения.

Когда следует использовать System.gc ()

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

Недостатки включают в себя:

  • Вызов System.gc() обычно запускает полный GC, который занимает значительно больше времени, чем GC "нового пространства".
  • Пользовательможет на самом деле заботиться / заметить.Например, если вы вызываете System.gc() между «уровнями» в игре, загрузка следующего уровня занимает больше времени.
  • При форсировании GC вы заставляете JVM использовать дополнительные циклы ЦП и т. Д., Которые могут потенциально помешать другим вещам, которые пользователь делает на своей машине.

(Также могут быть веские причины для вызова System.gc() в модульных тестах и ​​во время отладки системы.)

16 голосов
/ 23 февраля 2011

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

Единственное практическое применение, о котором я могу думать, это

  1. Во время отладки форсирование коллекции может привести к утечке памяти
  2. Если программа проходит предсказуемые циклы интенсивных вычислений с последующим отсутствием вычислений (например, пошаговой игрой), в течение периода без вычислений ЦП можно было бы использовать для предлагаемой сборки мусора, чтобы предотвратить дрожание во время интенсивных вычислений.
4 голосов
/ 23 февраля 2011

System.gc () является только предложением. Но в некоторых ситуациях это имеет смысл.

Предположим, у вас есть класс MyClass, и вам интересно, сколько памяти занимает один экземпляр. Что вы можете сделать, это (грубо говоря):

MyClass [] objects= new MyClass[100000];
System.gc();
long memoryNow = Runtime.getRuntime().freeMemory();
for (int i = 0; i < 100000; i ++) {
  objects[i] = new MyClass();
}
System.gc();
long memoryLater = Runtime.getRuntime().freeMemory();
int objectSize = (int)((memoryLater - memoryNow) / 100000);

Есть и другие подобные случаи, которые я считаю System.gc () полезными.

1 голос
/ 07 марта 2013

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

1 голос
/ 06 августа 2012

Сборщик мусора всегда вызывается JVM, когда недостаточно памяти для размещения новых объектов в куче. Вызывая сборщик мусора, он следует нормам Stop the World и для этого вызывает метод System.gc().

Также помните, что JVM также запускает параллельные потоки gc для удаления неиспользуемых объектов из памяти. Таким образом, все и каждую минуту JVM поддерживает кучу памяти и всегда старается не перегружать ее. Поэтому нет необходимости явно вызывать метод System.gc() или Runtime.gc().

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

0 голосов
/ 07 декабря 2012

Нет необходимости звонить System.gc() или Runtime.getRuntime().gc().JVM внутренне контролирует сборку мусора, если обнаруживает, что ей не хватает памяти.

0 голосов
/ 24 февраля 2011

Процесс сбора мусора не находится под контролем пользователя. Поэтому нет смысла вызывать System.gc(); явно.Это полностью зависит от JVM.

Несколько дней назад я задал точно такой же вопрос: [ Здесь ] .

На самом деле, многие вопросы, связанные с явным вызовом System.gc();, уже были заданы и даны ответы здесь.Вызов System.gc(); явно всегда считается плохим навыком программирования, хотя это не принесет никакого вреда.

Вот несколько ссылок, по которым вы должны пройти.Это определенно прояснит ваши сомнения.

PS: Кстати, вы должны серьезно приложить extra усилия, чтобы пройти подобные вопросы StackOverflow передпост о своих сомнениях.

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