我的公司最近转移到Alfresco作为内容管理解决方案。由于一些内容是动态的(包含在另一个.jsp中的.jsp文件从Alfresco读取发布为xml的站点地图,并将结果缓存24小时),因此生成的文件是.jsp文件,并在Sun Web Server7 servlet容器中进行rsync和服务。
每个页面都有一个页眉、一个菜单和一个使用jsp:include运行时指令包含的页脚。我的理解是,当向index.jsp发出第一个请求时,将会有许多已编译的jsps,例如index.class、header.class、menu.class和footer.class。要求是让这些代码编译一次,servlet容器每隔x秒检查一次任何源jsps (由Alfresco推出)的修改。
web服务器本身已配置(default-web.xml)为生产就绪状态,并具有Sun建议的以下参数:
<init-param>
<param-name>development</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>checkInterval</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>fork</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>mappedfile</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>suppressSmap</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>classdebuginfo</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>trimSpaces</param-name>
<param-value>true</param-value>
</init-param>请注意,checkInterval参数应该设置为60,但这样做会导致web服务器无法启动(我还不能找出原因)。不幸的是,解决这个问题的办法是将development设置为true,这是我希望避免的。
servlet容器配置有以下JVM设置(也是Sun文档推荐的设置):
-server -Xrs -Xmx2048m -Xms2048m -Xmn2024m -XX:+AggressiveHeap -XX:LargePageSizeInBytes=256m -XX:+UseParallelOldGC -XX:+UseParallelGC -XX:ParallelGCThreads=8 -XX:+DisableExplicitGC在性能测试期间,我们看到Eden空间频繁地达到2 2gb (我们静态内容的总大小约为200mb,我们的测试针对的是少数几个页面)。其结果是大量的小集合;将对象快速推送到永久空间,并且它永远不会真正恢复,导致大量频繁的满GC (幸存者空间也从90mb缩减到2字节,我只能假设这是伊甸园空间,声称它是自己的-有人能证实吗?)这是我们最大的问号;我们的开发人员都不认为这是正常行为,但我们无法解释内存的去向。

我们看到的另一个问题是线程数。随着每个http请求在servlet上产生一个新线程,我希望它与负载成比例上升(我也认为在运行时执行jsp:include (已编译的父jsp中的RequestDispatcher.include())时,每个servlet中也会创建一个新线程)。然而,一旦每个请求得到服务,线程就会死亡,并在其位置上产生一个新的线程。这是一个正确的假设吗?无论负载如何,线程计数似乎都会停止并增长。
任何帮助都将不胜感激。
发布于 2011-08-04 17:38:37
堆使用图中的锯齿模式是正常的,并不表示内存泄漏。只有当锯齿的下限随着时间的推移呈上升趋势时,才会指示内存泄漏。
但是,总是执行完整的GC是一个问题,这可能表示存储泄漏。尝试使用内存分析器运行,看看是否可以发现泄漏的内容。
我有一种感觉,我知道可能是什么导致了泄漏。我想你说过你是动态生成JSP的。每当容器找到新的(或更新的) JSP时,它都会生成Java类,编译这些类,然后加载字节码。如果您不小心,旧的类/旧版本的类将保持可访问和泄漏。
我也不会期望线程数量随着负载的增加而增加和减少。一个像样的web容器将维护一个线程池,用于处理传入的请求。线程池通常有一个固定的上限,这样请求风暴就不会导致线程数量的爆炸性增长,从而导致资源使用和争用问题。
https://stackoverflow.com/questions/6938950
复制相似问题