Java Servlet中的JNDI查找是否会导致permgen内存泄漏?

Java Servlet中的JNDI查找是否会导致permgen内存泄漏?,java,servlets,jboss,jndi,permgen,Java,Servlets,Jboss,Jndi,Permgen,因为JBoss4.2不支持@EJB注入,所以我使用JNDI查找来引用Servlet所需的EJB 我担心这种类型的查找可能会导致JVM中的Permgen非堆内存增长 据我所知,JNDI是动态类加载的一种形式,因此这可能会导致类加载器泄漏 所以我的问题是,随着时间的推移,下面的servlet代码可能会导致Permgen内存泄漏吗 另外,我应该在查找之后显式调用InitialContext上的close()方法吗?由于在这里(Servlet中)实例化InitialContext的方式,GC是否有可能没

因为JBoss4.2不支持@EJB注入,所以我使用JNDI查找来引用Servlet所需的EJB

我担心这种类型的查找可能会导致JVM中的Permgen非堆内存增长

据我所知,JNDI是动态类加载的一种形式,因此这可能会导致类加载器泄漏

所以我的问题是,随着时间的推移,下面的servlet代码可能会导致Permgen内存泄漏吗

另外,我应该在查找之后显式调用InitialContext上的close()方法吗?由于在这里(Servlet中)实例化InitialContext的方式,GC是否有可能没有按照预期清理InitialContext

多谢各位

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);
}
}

是一种目录查找服务,也是Java Enterprise Edition应用程序服务器的核心技术。除非您有一个有缺陷的实现或者有一个使用模式异常的应用程序,否则我希望由于JNDI加载的类最终会稳定下来


无论哪种方式,我强烈建议您使用。在应用程序运行时拍摄几张快照,看看permgen不断增加时添加了什么。这些信息将直接向您显示问题所在,或者帮助您将根本原因缩小到更小的范围。

那么,是什么阻止了您增加permgen内存,因为它显然已经用完了?始终在上下文关闭的情况下添加finally block。嗨,Thomas,增加permgen上限不会有帮助,因为当前泄漏继续递增。谢谢Kim。泄漏仅发生在接触非常有限的生产系统中。此外,服务器正在运行Java 1.5,并且没有安装jmap和jhat,因此当前堆转储选项是有限的。另外,从我所读到的关于permgen泄漏的内容来看,堆转储将提供关于非堆permgen内存内容的有限有用信息。不过,我确实意识到我需要找出一些方法来获取泄漏的permgen的内容。请记住,permgen问题的一个常见原因是类装入器泄漏。滥用String.intern()也可能是一个根本原因