Я знаю, что garbage-collection
используется, чтобы избавиться от потерянных объектов (тех, которые теряют свои ссылки), но можно ли установить пользовательские интервалы для garbage-collecting
в Java
?
3 ответа
Не рекомендуется, чтобы приложение сообщало GC о запуске. Лучше оставить это на усмотрение JVM.
Зачем?
Потому что JVM знает лучше. JVM имеет доступ к информации, которая позволяет ему запускать JVM в оптимальное время, чтобы оптимизировать его либо для высокой пропускной способности, либо для низкого времени паузы. Он может отслеживать размер различных «пространств» кучи и определять наилучшее время для запуска коллекции и тип коллекции для запуска. Принятие решений сложно.
Напротив, если приложение вызывает System.gc()
через фиксированный интервал времени, оно может работать, когда в этом нет необходимости, без необходимости использовать циклы ЦП. Действительно, если вы запускаете сборщик мусора, когда мусора нет, он тратит много времени на сканирование всех живых объектов ... а затем ничего не добивается.
Следует также отметить, что если System.gc()
не игнорируется, обычным поведением является запуск полной сборки мусора. В зависимости от параметров GC вашей JVM это может привести к зависанию всех потоков приложения. Если куча велика, «GC-паузы» для полных коллекций могут быть значительными.
Другой ответ предлагает использовать свойство sun.rmi.dgc.client.gcInterval
. Это разработано, чтобы иметь дело со сбором удаленных ссылок в приложении RMI. Он может работать в других контекстах, но это нежелательно по причинам, указанным выше.
Весь смысл сборки мусора заключается в том, что разработчику не нужно беспокоиться об управлении памятью (как всегда могут быть исключения, но они редки)
Как уже указывалось, вы можете предложить JVM только для запуска GC из вашего кода Java.
Если у вас есть проблемы с интервалом GC, может быть, вы можете вместо этого установить некоторые параметры для вашей JVM? Может быть, вы можете использовать параметр:
gcInterval(ms) = max interval between GC
Но я никогда не использовал его сам, поэтому не имею опыта в этом.
Используя Runtime.getRuntime().gc()
или System.gc()
вы можете предложить JVM для сборки мусора, но вы не можете устанавливать интервалы или вызывать их любым способом
общедоступный статический void gc ()
Вызов метода gc предполагает, что виртуальная машина Java затрачивает усилия на переработку неиспользуемых объектов, чтобы сделать память, которую они в настоящее время занимают, доступной для быстрого повторного использования. Когда управление возвращается из вызова метода, виртуальная машина Java сделала все возможное, чтобы освободить место для всех отброшенных объектов.
Похожие вопросы
Новые вопросы
java
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].