Перво-наперво: НЕ ПРИЗЫВАЙТЕ ГУ GC
За исключением случаев, когда у вас есть для этого очень веские основания.И даже если вы так думаете, вы, вероятно, не знаете.
ГК знает, что делает (большую часть времени ...)
Если вы продолжали читать, я предполагаю, что у вас есть действительно очень хорошая (хотя, вероятно, искаженная) причина пытаться облажаться с ГХ, даже если это, скорее всего, будет гораздо умнее, чем когда вы определяете, когдаэто должно собирать память.Кроме того, имейте в виду, что, вызывая его явно, вы путаете его и портите его эвристику, чтобы он стал менее умным, чем был раньше.Все потому, что вы пытались перехитрить его.
GC не всегда заботится о том, что вы говорите
Если вы делаете это по очень веской причине или в случае, когда вы действительно хотитеубедитесь, что вы начинаете интенсивную секцию кода с наилучшим возможным состоянием памяти, вы должны знать, что это, вероятно, не сработает: вызовы System.gc()
не гарантируют, что произойдет сборка мусора, как упоминалось его Javadoc ( выделение ) :
Вызов метода gc предполагает , что виртуальная машина Java является виртуальной машиной Javaзатратить усилия на переработку неиспользованных предметов.
Другие рекомендации
Охота и убийство (плохо) Явное GC
- включить
-XX:+DisableExplicitGC
(если вашJVM поддерживает это), чтобы предотвратить эти безумные призывы к причинению какого-либо вреда (благодарность Фредрику в комментариях) - посмотрите в вашей любимой IDE или
grep
для вызовов на System.gc()
и ее эквиваленты и избавьтесь от них.
Найди другой путь
См. Ответ Grooveek для других полезных советов (например, использование WeakReference
s).
Экспериментируйте с другими GC и настраивайте свою виртуальную машину для своего приложения
В зависимости от вашего варианта использования, возможно, могут помочь эксперименты с другими реализациями GC: CMC, G1, ParallelGC и т. Д. Если вы хотите избежать «зависаний», у меня были очень хорошие результаты с G1 с момента его появления в последней версии.Java SE 6 обновляется и, начиная с выпуска Java 7, запускает интенсивные корпоративные приложения в течение длительных периодов.
Просто имейте в виду, что настройка JVM - очень сложное искусство.
Дополнительная литература
Вы можете пролистать их для более подробной информации:
* Используйте с осторожностью: иногда не совсем в курсе, не документирует все иперечисляет множество экспериментальных функций или только для HotSpot.