JAXBContext.newInstance утечка памяти - PullRequest
13 голосов
/ 27 августа 2010

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

При поступлении запроса эта строка вызывается:

JAXBContext jc = JAXBContext.newInstance(“ruby.oracle_servlet.schemas”);

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

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

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

Спасибо

Ответы [ 2 ]

8 голосов
/ 27 августа 2010

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

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

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

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

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

1 голос
/ 08 апреля 2013

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

JAXBContext.newInstance(“ruby.oracle_servlet.schemas”)
...