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

Сбор мусора Java

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

4b9b3361

Ответ 1

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

Они нам не нужны. Действительно, в большинстве случаев вызов System.gc() вреден для производительности приложения. Для подробного объяснения см. Мой ответ на "Почему это плохой метод для вызова системы gc" .

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

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

Недостатки:

  • Вызов System.gc() обычно запускает полный GC, который занимает значительно больше, чем GC нового пространства.
  • Задействуя GC, вы вызываете JVM для использования дополнительных циклов процессора и т.д., которые могут потенциально мешать другим вещам, которые пользователь делает на своей машине.

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

Ответ 2

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

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

  • Во время отладки принудительная сборка может вызвать утечку памяти
  • Если программа проходит через предсказуемые циклы интенсивного вычисления, после чего не вычисляются (например, игра, основанная на поворотах), в течение периода без вычислений ЦП может использоваться для предлагаемой сборки мусора, чтобы предотвратить дрожание во время интенсивных вычислений.

Ответ 3

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(), чтобы быть полезными.

Ответ 4

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

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

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

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

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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