我使用嵌入式jetty作为Java应用程序服务器,最大JVM内存设置为800MB。 我创建了一种部署和取消部署Web存档的方法。每次我使用基本的hello world应用程序部署war时,嵌入式应用程序服务器会使用大约200MB的额外内存,这会在我添加第4个Web应用程序后导致内存不足。这是嵌入式Jetty用作应用程序服务器时的预期行为吗?
@ManagedOperation
public boolean deployWebApp(String context, String pathToWar){
boolean success = false;
WebAppContext webctx = null;
try{
webctx = addWebApp(context, pathToWar);
webctx.getTempDirectory();
webctx.start();
success = webctx.isRunning();
} catch (Exception e) {
e.printStackTrace();
logger.log(Level.SEVERE, "Failed to startup webapp with webappcontext: ", webapps.get(context).getContextPath());
}
return success;
}
答案 0 :(得分:1)
不,我使用嵌入式Jetty,它不会使用任何类似内存的内容。
最好的办法是创建堆转储,然后使用Eclipse Memory Analyzer之类的工具来分析堆,看看它们消耗了大量内存的Web应用程序是什么。
答案 1 :(得分:0)
取消部署/部署内存泄漏可能与各种已知的JRE ClassLoader固定问题有关。
我们最近(截至过去2天!)在服务器端类加载器中添加了一些预先防止这种固定的预防措施,以允许WebAppClassLoader以不泄漏对ClassLoader的引用的方式运行。 / p>
这些都是通过Server.addBean(Object)方法添加到服务器的。
您可能会在嵌入式服务器上使用这些产品。
答案 2 :(得分:0)
在使用jconsole并浏览contexthandlercollection中的每个处理程序之后,发现未部署的webapps没有删除securityhandler和sessionhandler,因此perm gen继续增长。
我们以编程方式删除了每个处理程序,我们可以看到perm gen内存减少。
this.getSessionHandler().stop();
this.getSessionHandler().destroy();
this.getSecurityHandler().stop();
this.getSecurityHandler().destroy();