使用嵌入式Jetty作为应用程序服务器时内存被阻止

时间:2012-08-08 09:08:52

标签: java memory jetty

我使用嵌入式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;     
}

3 个答案:

答案 0 :(得分:1)

不,我使用嵌入式Jetty,它不会使用任何类似内存的内容。

最好的办法是创建堆转储,然后使用Eclipse Memory Analyzer之类的工具来分析堆,看看它们消耗了大量内存的Web应用程序是什么。

答案 1 :(得分:0)

取消部署/部署内存泄漏可能与各种已知的JRE ClassLoader固定问题有关。

我们最近(截至过去2天!)在服务器端类加载器中添加了一些预先防止这种固定的预防措施,以允许WebAppClassLoader以不泄漏对ClassLoader的引用的方式运行。 / p>

请参阅:http://git.eclipse.org/c/jetty/org.eclipse.jetty.project.git/tree/jetty-util/src/main/java/org/eclipse/jetty/util/preventers

这些都是通过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();