Я относительно новичок в программировании на Java, поэтому, пожалуйста, потерпите меня, пытаясь понять, что здесь происходит.
Приложение, которое я разработал, использует максимальный размер кучи 256 МБ. После завершения GC у меня никогда не было проблем с этим. Используемая куча накапливается при загрузке большого изображения и прекрасно освобождается при его выгрузке. Ошибки нехватки памяти - это то, что мне еще предстоит увидеть.
Однако ... Запуск приложения около часа. Я заметил, что процесс использует все больше системной памяти, которая никогда не освобождается. Таким образом, приложение запускается с использованием около 160 МБ и увеличивается по мере увеличения размера кучи, но когда размер кучи уменьшается, используемая системная память просто продолжает увеличиваться. До тех пор, пока процесс не использует 2,5 ГБ, и моя система не начинает работать медленно.
Теперь я немного пытаюсь понять выжившие поколения. Кажется, размер кучи и выжившие поколения на самом деле не связаны друг с другом? Мое приложение создает много выживших поколений, но мне никогда не хватает памяти в соответствии с используемой памятью самого приложения. Но JVM продолжает пожирать память, никогда не возвращая ее в систему.
Я искал в Интернете, иногда находя информацию, которая несколько полезна. Но чего я не понимаю, так это того, что приложение остается в границах размера кучи, и моя системная память все еще расходуется.
Что здесь происходит?
Я использую IDE NetBeans в OSX Lion с последней доступной 1.6 JDK.