Разница между System.gc () и восстановлением мертвых объектов, выполняемым путем получения дампа кучи только для использования? - PullRequest
3 голосов
/ 11 ноября 2010

Существует как минимум два способа, прямо или косвенно, предположить, что JVM затрачивает усилия на сбор мусора:

  • System.gc()
  • берет дамп кучи и запрашивает только живые объекты

В последнем я могу получить программный дамп кучи, например, через

hotspotMBean = ManagementFactory.newPlatformMXBeanProxy(ManagementFactory.getPlatformMBeanServer(), "com.sun.management:type=HotSpotDiagnostic", HotSpotDiagnosticMXBean.class);
hotspotMBean.dumpHeap(filename, live);

Какая разница, если таковые имеются, между тем, что эти две операции будут делать для сбора объектов, не достижимых для достижения цели?

Я полагаю, что у меня есть доказательства того, что подход с использованием динамической памяти более агрессивен, чем System.gc(), при наличии некоторой комбинации слабых ссылок, распределенной сборки мусора RMI и невидимых объектов, сильно доступных из стека . В частности, объекты, которые только слабо достижимы локально и стали Unreferenced относительно RMI, по-видимому, собираются только дампом кучи. Я еще не смог преобразовать это в небольшой тестовый пример, но он воспроизводим.

(До того, как меня предупредили о том, что я не полагаюсь на определенное поведение GC в программном коде, я этого не сделал. Я обнаружил это при исследовании потенциальной утечки памяти и заметил, что результат варьируется в зависимости от того, когда я сделал дамп кучи. I Мне просто любопытно.)

Используется 64-битный сервер HotSpot VM 1.6.0_22 в Windows 7.

1 Ответ

1 голос
/ 11 ноября 2010

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

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

Увы, у меня нет убедительных доказательств такого поведения, и это скорее дикое предположение, чемреальное объяснение.

...