Вам нужно понять центральный факт об эргономике сборщика мусора:
Дорогостоящей частью сборки мусора является поиск и обработка объектов, которые НЕ являются мусором.
Это означает: по мере того, как куча приближается к своей максимальной емкости, сборщик мусора будет тратить все больше и больше времени на все меньшую отдачу в освобожденном пространстве. Если бы сборщик мусора пытался использовать каждый последний байт памяти, конечным результатом было бы то, что ваша JVM тратила бы все больше и больше времени на сборку мусора, пока... в конце концов... почти не выполнялась бы полезная работа.
Чтобы избежать этой патологической ситуации, JVM отслеживает соотношение времени, затрачиваемого на сборку мусора и выполнение полезной работы. Когда соотношение превышает настраиваемое пороговое значение, сборщик мусора выдает OutOfMemoryError
... даже несмотря на то, что (технически) имеется свободная память. Это, вероятно, то, что вы видите, хотя другие объяснения столь же правдоподобны.
Вы можете изменить пороги GC, размеры генерации и т. д. с помощью параметров JVM, но, вероятно, лучше этого не делать. Лучше выяснить, почему использование памяти вашим приложением постоянно растет. Скорее всего, это утечки памяти... т.е. ошибки... в вашем коде, которые вызывают это. Потратьте свои усилия на поиск и исправление этих ошибок, а не беспокойтесь о том, почему вы не используете всю память.
(На самом деле, вы используете его... но не все время.)
person
Stephen C
schedule
04.05.2011