Экономия пространства PermGen с помощью нескольких загрузчиков классов - PullRequest
6 голосов
/ 14 октября 2011

Мы пишем большое приложение с графическим интерфейсом в Scala с большим количеством классов, и нам пришлось увеличить пространство PermGen, чтобы можно было загружать все классы.Само приложение показывает серию экранных действий, каждое из которых загружает свой большой набор классов.Только один вид деятельности загружается / отображается в любой момент времени.После выполнения нескольких действий у нас было OutOfMemoryError в пространстве PermGen.

Я понимаю, что пространство PermGen - это мусор, собираемый точно так же, как остальная часть кучи , но яМне интересно узнать, могу ли я уменьшить пространство PermGen, необходимое, например, одним ClassLoader на действие, чтобы разрешить выгрузку классов.

Итак:

  1. Я понимаю, что классызагруженный системой ClassLoader не может быть выгружен, так как на них всегда будет ссылаться их загрузчик классов.Это правда?
  2. При условии, что больше нет экземпляров класса, загруженного моим пользовательским загрузчиком классов, и загрузчик классов может быть собран мусором, будут ли его классы выгружены, освобождая пространство PermGen?
  3. Есть ли какие-либо предостережения относительно (или распространенных ошибок, которые могли бы предотвратить) выгрузки классов?

1 Ответ

6 голосов
/ 14 октября 2011

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

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

Насколько велик ваш PermGen? Вы можете избежать неприятностей, просто столкнувшись с PermGen:

-XX:MaxPermGen=256m

в вашей командной строке. Это не редкость, чтобы установить его на 512 м. Если вы хотите по-настоящему надежное решение, вам нужно пойти по пути использования пользовательского загрузчика классов для каждого «действия». Чтобы помочь с отладкой, добавьте также следующий понятный аргумент в вашу командную строку:

-XX:+TraceClassLoading

Это выведет классы по мере их загрузки в JVM в командную строку.

...