Может ли поиск JNDI в сервлете вызвать утечку памяти permgen? - PullRequest
1 голос
/ 04 марта 2011

Поскольку JBoss 4.2 не поддерживает инъекции @EJB, я использую поиск JNDI для ссылки на EJB, который необходим сервлету.

Я обеспокоен тем, что этот тип поиска может привести к росту памяти без кучи Permgen в JVM.

Как я понимаю, JNDI - это форма динамической загрузки классов, поэтому это может вызвать утечку загрузчика классов.

Итак, мой вопрос: может ли приведенный ниже код сервлета вызывать утечку памяти Permgen с течением времени?

Кроме того, я должен явно вызывать метод close () в InitialContext после поиска? Есть ли вероятность, что GC не очищает InitialContexts, как ожидалось, из-за того, как они создаются здесь (в сервлете)?

Спасибо.

public class MyServlet extends HttpServlet {

// JBoss 4.x does not support @EJB injections in servlets (see jndi lookup below)
@EJB
private MyService myService;

private static final String SERVICE_JNDI_NAME = "MyServiceBean";

private Logger log = Logger.getLogger(this.getClass().getPackage().getName());


public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

try {
    // JBoss 4.x does not support @EJB injections in servlets
    InitialContext ctx = new javax.naming.InitialContext();
    myService = (MyService) ctx.lookup(SERVICE_JNDI_NAME);
} catch (NamingException e) {
    log.warn("NamingException trying to lookup MyService in context");
    throw new RuntimeException(e);
}

...

RequestDispatcher requestDispatcher = request.getRequestDispatcher("/page.jsp");
requestDispatcher.forward(request, response);
}

}

1 Ответ

0 голосов
/ 05 марта 2011

JNDI - это служба поиска каталогов и основная технология серверов приложений Java Enterprise Edition. Если у вас нет ошибочной реализации или нет приложения с необычным шаблоном использования, то я ожидаю, что классы, загруженные из-за JNDI, в конечном итоге стабилизируются.

В любом случае, я настоятельно рекомендую вам использовать анализатор дампа кучи . Сделайте несколько снимков, когда ваше приложение работает, и посмотрите, что добавляется, когда permgen продолжает увеличиваться. Эта информация либо напрямую покажет вам, в чем проблема, либо поможет сузить основную причину до гораздо меньшей области.

...