1

由于 JBoss 4.2 不支持 @EJB 注入,因此我使用 JNDI 查找来引用 Servlet 所需的 EJB。

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

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

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

另外,我应该在查找后显式调用 InitialContext 上的 close() 方法吗?由于在此处(在 Servlet 中)实例化它们的方式,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);
}

}

4

1 回答 1

0

JNDI是一种目录查找服务,是Java企业版应用服务器的核心技术。除非你有一个错误的实现或者有一个不寻常的使用模式的应用程序,否则我希望由于 JNDI 加载的类最终会稳定下来。

无论哪种方式,我强烈建议您使用堆转储分析器。在您的应用程序运行时拍摄几个快照,并查看当 permgen 不断增加时添加的内容。此信息将直接向您显示问题所在,或帮助将根本原因缩小到更小的区域。

于 2011-03-04T21:18:59.223 回答