Утечка памяти JAXBContext.newInstance

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

Всякий раз, когда приходит запрос, эта строка вызывается:

JAXBContext jc = JAXBContext.newInstance("ruby.oracle_servlet.schemas");

По какой-то причине объект никогда не получает сбор мусора. Когда мы сделали его статическим и перемещали там, где мы его инициализировали, наша утечка памяти исчезла.

Еще один из наших разработчиков разместил эту строку в цикле while в автономном java-приложении, а также увидел, что память ползет вверх и вверх.

Есть ли у кого-нибудь идеи, почему этот объект не получает сбор мусора?

Спасибо

Ответы

Ответ 1

Какую реализацию и версию JAXB вы используете? Если вы используете эталонную реализацию, которая поставляется с Java SE 6, то это Metro (https://jaxb.dev.java.net/).

Вот некоторые ошибки, связанные с памятью:

Если вы используете реализацию MOXy (http://www.eclipse.org/eclipselink/moxy.php), тогда я могу помочь в отладке.

Хорошей новостью является то, что JAXBContext является поточно-ориентированным и должен создаваться только один раз и использоваться повторно. Повторное использование JAXBContext также помогает решить проблему утечки памяти.

Для получения дополнительной информации см.:

Ответ 2

Да, это утечка. Он будет загружать класс "ruby.oracle_servlet.schemas" при каждом вызове этого метода.

JAXBContext.newInstance("ruby.oracle_servlet.schemas")