Экономия пространства PermGen с помощью нескольких загрузчиков классов

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

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

Итак:

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

6
задан Community 23 May 2017 в 12:12
поделиться