3

我使用嵌入式码头作为 Java 应用程序服务器,最大 JVM 内存设置为 800MB。我创建了一种部署和取消部署 Web 档案的方法。每次我使用基本的 hello world 应用程序部署战争时,嵌入式应用程序服务器都会使用大约 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;     
}
4

3 回答 3

1

不,我使用嵌入式 Jetty,它不使用任何类似内存量的东西。

最好的办法是创建一个堆转储,然后使用 Eclipse 内存分析器之类的工具来分析堆,并查看消耗如此多内存的 Web 应用程序是什么。

于 2012-08-08T13:05:41.377 回答
0

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

我们最近(截至过去 2 天!)向服务器端类加载器添加了一些先发制人的阻止器,以允许 WebAppClassLoader 以不泄漏对 ClassLoader 的引用的方式运行。

见: 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) 方法添加到服务器的。

在您的嵌入式服务器上使用这些可能会有一些运气。

于 2012-08-11T04:12:36.960 回答
0

在使用 jconsole 并遍历 contexthandlercollection 中的每个处理程序后,发现未部署的 web 应用程序没有删除 securityhandlers 和 sessionhandlers,因此 perm gen 不断增长。

我们以编程方式删除了每个处理程序,我们可以看到 perm gen 内存减少。

this.getSessionHandler().stop();
this.getSessionHandler().destroy();
this.getSecurityHandler().stop();
this.getSecurityHandler().destroy();
于 2013-02-15T10:01:09.333 回答