java - BlazeDS 和 ColdFusion - jRun 内存使用量增加导致 java.lang.OutOfMemoryError : Java heap space

标签 java memory coldfusion blazeds jrun

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

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

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

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

运行线程、可用线程、Jrun session 、总使用内存 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)

有时内存运行非常高但没有抛出内存不足错误,然后,随着 Activity 安静下来内存被释放,但可用内存可以在 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>

最佳答案

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

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

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

顺便说一句:你们的 session 超时策略是什么?

关于java - BlazeDS 和 ColdFusion - jRun 内存使用量增加导致 java.lang.OutOfMemoryError : Java heap space,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1599701/

相关文章:

java - 编写一个小的 Java 代码,可以接受 3 个整数,并输出最小的一个

linux - Linux 系统上的内存使用

java - 运行 java -version 时“无法为对象堆保留足够的空间”

javascript - 使用 javascript 控制 CFINCLUDE 文件

mysql - 尝试使用 ColdFusion MX 7 更新 mysql 表

java - 如何将 "chkdsk"与 JPowershell 一起使用?

Java - 不可变数组线程安全

ColdFusion Builder 3 - 如何不解析为 XML?

java - 如何将 JSlider 股票代码设置为从 slider 开头开始(在 Java 中)?

c - 将字符串存储在共享内存 C 上