Coldfusion中请求的正常内存使用情况是什么

时间:2011-04-06 03:11:39

标签: coldfusion

看看Coldfusion的服务器监视器,我看到很多请求的平均内存使用量平均为100KB到700KB。这对我来说似乎很高,是吗?

如果它很高,它可以解释为什么服务器似乎喜欢吃RAM并且永远不会放弃它。找出内存使用率如此之高的好方法是什么。我无法想到会使用这么多内存。是否有任何调试Coldfusion请求的好方法?

3 个答案:

答案 0 :(得分:2)

我们在SeeFusion上运气不错,只是在服务器上使用Jconsole来监控内存和线程。 我们发现的一件事是,在将数据呈现给用户的期间,内存使用率最高。一旦表单显示,内存显着下降。确保垃圾收集设置正确。

答案 1 :(得分:1)

你真的得到'内存不足'的例外吗?或者“堆栈空间”错误?仔细检查日志,因为我之前有过自动重启CF的经验 - 检查server.log文件。

如果答案是肯定的,那么 - 如上所述 - 您可以使用JConsole之类的工具来监控内存使用情况。如果您看到内存在这些异常之前上升和下降,那么您需要找出内存泄漏的位置。执行此操作的最佳方法是在此时获取JVM的转储并使用meomry分析工具。我documented我们对此的经验。

如果没有异常等,那么请注意,JRun 会占用大量内存。即使JVM堆大小的CF Admin设置为1024MB,我们的Win32服务器上通常也会介于500MB和1.5GB之间。 JRun并且运行在Java之上,运行应用程序服务器,因此这将足够高。您需要注意的是使用JConsole不断增加内存使用。

至于GC调整 - 如果你真的遇到问题,只会弄乱这些设置。它很复杂,如果操作不正确或者不了解Java GC的工作原理,将导致服务器不稳定。您可以获得基础here,然后您可以将设置(例如-XX:MaxPermSize=192m)作为CF管理员中的JVM参数传递。

深入了解内存问题可能具有挑战性和耗时,所以祝你好运!

答案 2 :(得分:1)

听起来像是内存泄漏。您希望生成JVM堆转储 - JVM内存的快照。最简单的方法是使用jvisualvm。然后使用Eclipse Memory Analyzer中的泄漏报告分析该快照。 Marc Escher has a blog entry on this topic

设置JVM JMX端口以获取ColdFusion堆转储的步骤

  • 编辑jvm.config并添加到java.args:-Dcom.sun.management.jmxremote.port = 3333 -Dcom.sun.management.jmxremote.ssl = false -Dcom.sun.management.jmxremote.authenticate = true
  • 复制\ ColdFusion9 \ runtime \ jre \ lib \ management \ jmxremote.access.template - > jxmremote.access
  • 编辑jxmremote.access将“controlRole changeIt”添加到文件末尾,用您选择的密码替换“changeIt”
  • 在Windows资源管理器中> jxmremote.access>右键单击>属性>安全>高级
    • 所有者>管理员
    • 权限>取消选中“允许继承....”>对话框单击“复制”
    • 使用完全控制添加“管理员”
    • 删除所有其他权限条目
    • 点击“确定”
  • 重启ColdFusion

生成堆转储

  • 在ColdFusion框上安装JDK
  • jdk-install-dir/bin/jvisualvm
  • 运行jvisualvm
  • 打开JMX连接(例如localhost:3333)
  • 在“监视器”选项卡上单击堆转储按钮,并通过右键单击其节点
  • 来保存结果
  • 获取此文件并在Eclipse Memory Analyzer中打开并运行Leaks Report
  • 深入研究,使用Eclipse帮助了解如何评估

我使用这种方法在ColdFusion代码中查找了许多内存泄漏。