После недавнего развертывания в системном тесте один из наших сервлетов получил удар намного сильнее, чем обычно, и мы заметили, что память начала расти, и weblogic в конечном итоге умрет. Мой стажер, я был очень горд, обнаружил источник утечки памяти.
Всякий раз, когда приходит запрос, эта строка вызывается:
JAXBContext jc = JAXBContext.newInstance(“ruby.oracle_servlet.schemas”);
По какой-то причине объект никогда не получает мусор. Как только мы сделали его статичным и переместились туда, где его инициализировали, утечка памяти ушла.
Еще один из наших разработчиков поместил именно эту строку в цикл while в автономном Java-приложении, а также увидел, как память переползает вверх и вверх.
У кого-нибудь есть идеи, почему этот объект не собирается мусором?
Спасибо
Какую реализацию и версию JAXB вы используете? Если вы используете эталонную реализацию, поставляемую с Java SE 6, то это Metro (https://jaxb.dev.java.net/).
Вот некоторые из ошибок, связанных с памятью:
Если вы используете реализацию MOXy (http://www.eclipse.org/eclipselink/moxy. php), тогда я могу помочь с отладкой.
Хорошей новостью является то, что JAXBContext является потокобезопасным и должен создаваться только один раз и использоваться повторно. Повторное использование JAXBContext также устраняет утечку памяти.
Для получения дополнительной информации см.: