2012-08-08 32 views
3

我使用嵌入式码头作为Java应用程序服务器,以最大的JVM内存设置为800MB。 我创建了一个方法来部署和取消部署Web档案。每次我用基本的Hello World应用程序部署一场战争时,嵌入式应用程序服务器使用大约200MB的附加内存,这会在添加第4个Web应用程序后导致内存不足。这是嵌入式Jetty作为应用程序服务器使用时的预期行为吗?记忆勾勒出当使用嵌入式的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

在使用jconsole并遍历contexthandlercollection中的每个处理程序之后,发现未部署的webapps未删除安全处理程序和会话处理程序,因此perm gen不断增长。

我们编程删除这些每一个处理程序,我们可以看到烫发根内存减少。

this.getSessionHandler().stop(); 
this.getSessionHandler().destroy(); 
this.getSecurityHandler().stop(); 
this.getSecurityHandler().destroy(); 
1

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

做的最好的事情就是创建一个堆转储,然后使用像Eclipse的内存分析工具来分析堆,看看它是关于正在消耗这么多内存的Web应用程序。

+0

认为,这不应该是码头这样做,也有码头的叠加机制,以减少同一场战争的多个实例的内存使用情况,如果这是你的投篮命中:http://webtide.intalio.com/2011/05/jetty-overlayed-webapp-deployer/ – 2012-08-08 13:08:56

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)方法服务器。

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

+0

你会想让自己成为一个内存分析器工具,捕获内存利用率,并试图找出实际利用率的位置。 (码头,第三方lib下,JRE的,你的应用程序?)http://stackoverflow.com/questions/1716597/java-memory-leak-detection-tools – 2012-08-14 13:50:00

+0

感谢joakime,这符合我的怀疑。我将问题隔离到导致OOM错误的Permgen内存。当应用程序取消部署时,permgen大小不会降低,从而使嵌入式应用程序服务器实际上成为定时炸弹。不知道如何解决该问题,而不是重新启动JVM来加载/卸载war包或使用其他JVM,如不使用permgen的JRockit。 – ronly2008 2012-08-14 13:53:19

+0

目前我们正在使用jetty-7.6.1.v20120215和Oracle JVM版本1.6.0_26以及以下内存启动配置; memory.opts = -XX:MaxPermSize = 128m -XX:+ UseParNewGC -XX:MaxNewSize = 256m -XX:NewSize = 256m -Xms256m -Xmx1024m -XX:SurvivorRatio = 128 -XX:MaxTenuringThreshold = 0 -XX:+ UseTLAB- XX:+ UseConcMarkSweepGC -XX:+ CMSClassUnloadingEnabled -XX:+ CMSPermGenSweepingEnabled – ronly2008 2012-08-14 13:54:24

相关问题