Сборка мусора работает таинственными способами.
В экосистеме Java было несколько реализаций сборщиков мусора с очень разным поведением.
Время выполнения сборки мусора зависит от реализации сборщика мусора, а также может зависеть от текущего состояния JVM. Один сборщик может работать почти непрерывно, в то время как другой может подождать, пока не останется мало памяти. (Я сильно упрощаю здесь, чтобы прояснить суть.)
То, будет ли собран весь мусор или только его часть, может также зависеть от реализации сборщика и состояния JVM.
Вызов System.gc
- это просто предложение , а не команда. Сборщик мусора может игнорировать его.
В Java вы не должны прилагать больших усилий для управления памятью. Современные реализации JVM намного лучше, чем любой отдельный программист. Просто убедитесь, что выполнили все ссылки на ваши объекты, когда закончили их использовать. Или используйте WeakReference
/ SoftReference
. Затем доверьте выполнение своей работы JVM и сборщику мусора.
В экстремальных случаях (очень большой объем памяти или экстремальные объемы оттока объектов) вы можете изучить поведение различных реализаций сборщика мусора. И, возможно, рассмотрите альтернативы, такие как Zing от Azul Systems или GraalVM от Oracle. Но для большинства проектов обычные JVM на основе OpenJDK работают достаточно хорошо.