4

我在 Coldfusion 8 的实例中运行 BlazeDS。一个灵活的聊天应用程序,它同时充当生产者和消费者,允许 70 个长轮询请求,以 2 秒的轮询间隔移动到客户端轮询。jRun 指标日志记录已启用。服务器设置为最大堆大小为 1200mb、最大 210 个 jrun 线程和最大 150 个同时闪存远程处理请求。

所有这些似乎都在巡航数小时,与以下 JRun 统计数据没有太大偏差。

运行线程数、可用线程数、Jrun 会话数、总使用内存 MB、可用内存 MB
71,101、148、332.864、34.866

然后突然之间,可能在几个小时内,内存慢慢增加,有时我会遇到 java.lang.OutOfMemoryError: Java heap space exception。内存正在使用但未释放,我最终得到了大致附加的指标数据。

运行线程数、可用线程数、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。记忆中没有逐渐释放。

有没有人遇到过这样的事情?

我的服务-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>
4

1 回答 1

3

您最好的方法是标准的 Java OutOfMemoryError 分析:

  • 添加-XX:+HeapDumpOnOutOfMemoryError到您的 JVM 启动参数
  • 观察错误情况,它将创建一个二进制头转储文件TOMCAT_HOME
  • 使用分析器分析堆转储文件,例如 Eclipse 项目的内存分析器 (MAT)

这将告诉您哪些对象正在占用您的所有内存。我认为现在关注java.lang.IllegalStateException. 当 JVM 内存不足时,所有的赌注都没有了——可能会看到各种错误消息。

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

于 2009-10-25T17:23:14.550 回答