Я знаю, что garbage-collection используется, чтобы избавиться от потерянных объектов (тех, которые теряют свои ссылки), но можно ли установить пользовательские интервалы для garbage-collecting в Java?

-4
sticky_elbows 21 Авг 2018 в 12:59

3 ответа

Лучший ответ

Не рекомендуется, чтобы приложение сообщало GC о запуске. Лучше оставить это на усмотрение JVM.

Зачем?

Потому что JVM знает лучше. JVM имеет доступ к информации, которая позволяет ему запускать JVM в оптимальное время, чтобы оптимизировать его либо для высокой пропускной способности, либо для низкого времени паузы. Он может отслеживать размер различных «пространств» кучи и определять наилучшее время для запуска коллекции и тип коллекции для запуска. Принятие решений сложно.

Напротив, если приложение вызывает System.gc() через фиксированный интервал времени, оно может работать, когда в этом нет необходимости, без необходимости использовать циклы ЦП. Действительно, если вы запускаете сборщик мусора, когда мусора нет, он тратит много времени на сканирование всех живых объектов ... а затем ничего не добивается.

Следует также отметить, что если System.gc() не игнорируется, обычным поведением является запуск полной сборки мусора. В зависимости от параметров GC вашей JVM это может привести к зависанию всех потоков приложения. Если куча велика, «GC-паузы» для полных коллекций могут быть значительными.


Другой ответ предлагает использовать свойство sun.rmi.dgc.client.gcInterval. Это разработано, чтобы иметь дело со сбором удаленных ссылок в приложении RMI. Он может работать в других контекстах, но это нежелательно по причинам, указанным выше.

4
Stephen C 22 Авг 2018 в 02:53

Весь смысл сборки мусора заключается в том, что разработчику не нужно беспокоиться об управлении памятью (как всегда могут быть исключения, но они редки)

Как уже указывалось, вы можете предложить JVM только для запуска GC из вашего кода Java.

Если у вас есть проблемы с интервалом GC, может быть, вы можете вместо этого установить некоторые параметры для вашей JVM? Может быть, вы можете использовать параметр:

gcInterval(ms) = max interval between GC

Но я никогда не использовал его сам, поэтому не имею опыта в этом.

0
ChrisN 21 Авг 2018 в 10:14

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

общедоступный статический void gc ()

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

1
Ashishkumar Singh 21 Авг 2018 в 10:03
51946178