看看Coldfusion的服务器监视器,我看到很多请求的平均内存使用量平均为100KB到700KB。这对我来说似乎很高,是吗?
如果它很高,它可以解释为什么服务器似乎喜欢吃RAM并且永远不会放弃它。找出内存使用率如此之高的好方法是什么。我无法想到会使用这么多内存。是否有任何调试Coldfusion请求的好方法?
答案 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堆转储的步骤
生成堆转储
jdk-install-dir/bin/jvisualvm
我使用这种方法在ColdFusion代码中查找了许多内存泄漏。