РЕДАКТИРОВАТЬ :
Я обнаружил утечку загрузчика классов в своем веб-приложении.Это сводится к тому, что сторонняя библиотека инициализирует CORBA через службу имен COS JNDI и не подвергает вызов чистому закрытию контекста JNDI.Это оставляет некоторые связанные с CORBA потоки и другие ресурсы, ссылающиеся на мой загрузчик классов webapp и предотвращающие его сборку мусора.Это приводит к ошибке OutOfMemory: PermGen после нескольких повторных развертываний / перезагрузок.
На данный момент я увеличил объем памяти PermGen в JVM, и это увеличивает интервалы между сбоями сервера.Это, очевидно, не исправление, а обходной путь (и плохой в этом отношении).
Я предполагаю, что мой вопрос заключается в том, можно ли каким-то образом отключить JNDI-контекст без сохранения ссылки на него .Мои инстинкты говорят мне «нет», но, возможно, я не знаю о какой-то магической функции JNDI, которая позволила бы мне овладеть этим контекстом.
Таким образом, способ, которым сторонняя библиотека инициализирует объекты CORBA, является чем-то вроде этогостроки (обработка исключений и другие подробности опущены для краткости):
private CorbaObjectAggregate initCorba() {
InitialContext ctx = null;
CorbaObjectAggregate corbaObjects = new CorbaObjectAggregate();
ORB orb = null;
Properties env = getContextEnvironment();
String[] args = null;
orb = ORB.init(args, null);
env.put("java.naming.corba.orb", orb);
ctx = new InitialContext(env);
//a bunch of object lookups follow
corbaObjects.someCorbaObjectReference = (SomeCorbaObjectClass) ctx.lookup("somePaht");
return corbaObjects;
}
Итак, ссылка на ctx
исчезла после того, как этот метод завершил выполнение ...
Я попытался остановить потоки вручнуюно это не устранило утечку.Я предполагаю, что есть некоторые другие ресурсы corba, хранящие загрузчик классов.Полагаю, я мог бы попытаться выследить их каким-нибудь методом очистки и освободить загрузчик классов таким образом, но я надеялся на какое-то более чистое решение.
Просто для ясности, сторонняя библиотека с закрытым исходным кодом, и я могу 'это действительно не меняет.Это также не жизнеспособный вариант, чтобы получить поддержку от компании, стоящей за этим.