Мы пишем большое приложение с графическим интерфейсом на Scala с большим количеством классов, и нам пришлось увеличить пространство PermGen, чтобы иметь возможность загружать все классы. Само приложение показывает серию экранных действий, каждое из которых загружает свой собственный большой набор классов. В любой момент времени загружается/отображается только одно действие. Пройдя пару мероприятий, мы получили OutOfMemoryError
в пространстве PermGen.
Я понимаю, что пространство PermGen - это мусор, собранный так же, как и остальная часть кучи, но мне интересно посмотреть, смогу ли я уменьшить пространство PermGen, необходимое, например, один ClassLoader
за каждое занятие, чтобы разрешить разгрузку класса.
So:
- Я понимаю, что классы, загруженные системой ClassLoader, не могут быть выгружены, так как на них всегда будет ссылаться их загрузчик классов. Это правда?
- Если больше нет экземпляров класса, загруженного моим пользовательским загрузчиком классов, и загрузчик классов может быть собран мусором, будут ли его классы выгружены, освобождая место PermGen?
- Есть ли какие-либо предостережения относительно (или распространенных ошибок, которые могут предотвратить) выгрузку классов?