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