BlazeDS 和 ColdFusion - jRun 内存使用量增加导致 java.lang.OutOfMemoryError: Java 堆空间不足

4
我在Coldfusion 8的一个实例中运行了BlazeDS。有一个Flex聊天应用程序,既充当生产者又充当使用70个长轮询请求,移动到客户端轮询,并设置轮询间隔为2秒。启用了jRun指标日志记录。服务器设置最大堆大小为1200mb,210个最大jrun线程和150个最大同时Flash远程请求。
所有情况似乎都可以持续数小时,没有太多偏离JRun统计数据。 运行线程,可用线程,Jrun会话,总使用内存MB,可用内存MB
71,101,148,332.864,34.866
然后突然,在几个小时的时间内,内存慢慢增加,有时我最终遇到java.lang.OutOfMemoryError:Java堆空间异常。内存正在被使用但没有释放,我最终得到大约附带度量数据的结果。 运行线程,可用线程,Jrun会话,总使用内存MB,可用内存MB
71,130,195,1015.424,249.94
Coldfusion监视器没有显示任何异常的内存使用情况,也没有抛出任何应用程序异常。
我可以在system.out日志中看到以下错误之一,但不确定它们是否相关。我找不到有关BlazeDS的相关信息。
java.lang.IllegalStateException: Session is invalid
at jrun.servlet.session.JRunSession.checkSessionValidity(JRunSession.java:394)

有时候内存使用率很高,但没有出现内存不足的错误,随着活动减少,内存被释放,但可用内存在20秒内从480mb增加到800mb。内存没有逐渐释放。

有人遇到过类似的情况吗?

我的services-config.xml文件

<properties>  
  <polling-enabled>true</polling-enabled>  
  <polling-interval-millis>2000</polling-interval-millis>
  <wait-interval-millis>60000</wait-interval-millis>  
  <client-wait-interval-millis>1</client-wait-interval-millis>  
  <max-waiting-poll-requests>70</max-waiting-poll-requests> 
</properties>
1个回答

3
您最好的方法是标准的Java OutOfMemoryError分析:
  • -XX:+HeapDumpOnOutOfMemoryError添加到JVM启动参数中
  • 观察错误条件,它将在TOMCAT_HOME中创建一个二进制head dump文件
  • 使用分析器(例如Eclipse项目的 Memory Analyzer (MAT))分析堆转储文件

这将告诉您哪些对象正在吸收您所有的内存。 我认为现在集中精力解决java.lang.IllegalStateException还为时过早。 当JVM内存不足时,所有赌注都是失效的 - 可能会看到各种错误消息。

顺便问一句:您的会话超时策略是什么?


嗨,谢谢。ColdFusion8\wwwroot\WEB-INF\web.xml中的会话超时设置为30分钟。没有设置Coldfusion请求超时,我们允许BlazeDS长轮询请求。以下是BlazeDS services-config.xml中的设置:<properties> <polling-enabled>true</polling-enabled> <polling-interval-millis>2000</polling-interval-millis> <wait-interval-millis>60000</wait-interval-millis> <client-wait-interval-millis>1</client-wait-interval-millis> <max-waiting-poll-requests>70</max-waiting-poll-requests> </properties> - Barry Jordan
没有什么异常。使用我上面描述的步骤来找出占用内存的原因。 - Stu Thompson
谢谢,Stu。在运行IIS的ColdFusion配置下,转储文件将创建在哪里?你之前提到了TOMCAT_HOME,但这里不适用。干杯。 - Barry Jordan
哦,我的天啊。好的...我猜Java在那个配置中运行在其他地方。我对BlazeDS的经验仅限于Tomcat安装,其中它只是我的自己的webapp中的一些配置文件和库。在你的情况下,我甚至不知道从哪里开始。而且我已经将近6年没有接触过IIS了。我对ColdFusion也非常陌生。让我在谷歌上搜索一下,并向一些人询问如何完成这项工作。我有点困惑,真的很想知道这实际上是如何工作的。 - Stu Thompson
很久以前就回到这个问题了,但它又出现了,所以我想加上一条评论。这次我使用VisualVM来分析JVM并获取堆转储,然后进行了分析。对于最初的建议,Stu,虽然有些迟了,还是要感谢你。 - Barry Jordan
@Bazza,两年后!太好了 :) 很高兴你找到了问题和解决方案。 - Stu Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接