由於JBoss 4.2不支持@EJB注入,因此我使用JNDI查找來引用Servlet所需的EJB。Servlet中的JNDI查找是否會導致permgen內存泄漏?
我擔心這種查找可能會導致JVM中的Permgen非堆內存增長。
據我所知,JNDI是一種動態類加載的形式,所以這可能導致類加載器泄漏。
所以我的問題是,下面的servlet代碼可能會導致隨着時間的推移內存泄漏?
另外,我應該在查找後明確調用InitialContext上的close()方法嗎?由於在這裏實例化的方式(在Servlet中),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);
}
}
那麼什麼是阻止你增加permgen內存,因爲它顯然已經不多了?總是添加上下文關閉的塊。 – ThomasRS 2011-03-04 20:06:22
嗨托馬斯,增加permgen上限不會有幫助,因爲目前的泄漏繼續增加。 – 2011-03-04 20:55:37
是的,添加close方法。 – 2011-03-04 21:27:29