Вероятно, нет способа устранить проблему.Каждая JVM имеет одну область памяти PermGen, которая используется для загрузки классов и статических данных.Всякий раз, когда ваше приложение отменяется, его загрузчик классов следует отбрасывать, а также загружать все классы.Если это не удается из-за того, что другие ссылки на загрузчик классов все еще существуют, сборщик мусора, загрузчик классов и классы ваших приложений также не будут работать.
Запись в блоге и ее продолжение объяснениевозможный источник проблемы.Всякий раз, когда код контейнера приложения использует класс, который содержит ссылку на один из ваших классов, сборка мусора ваших классов запрещается.Примером из указанной записи в блоге является конструктор java.util.logging.Level
:
protected Level(String name, int value) {
this.name = name;
this.value = value;
synchronized (Level.class) {
known.add(this);
}
}
Обратите внимание, что known
является статическим членом java.util.logging.Level
.Конструктор хранит ссылку на все созданные экземпляры.Поэтому, как только класс Level
был загружен или создан из кода вашего приложения, сборщик мусора не сможет удалить ваши классы.
Чтобы решить эту проблему, вы можете избежать использования всех классов, которые используются вами самостоятельно.код или убедитесь, что нет ссылок на ваши классы из вашего кода.Обе проблемы могут возникать в любом классе, поставляемом с Java, и поэтому их невозможно исправить в приложении.Вы не можете предотвратить проблему, изменяя только свой собственный код!
Ваши варианты в основном:
- Увеличение пределов памяти и реже выдает ошибку
- Анализваш код подробно описан в связанных постах блога и избегайте использования классов, которые хранят ссылки на ваши объекты