我们很长一段时间都有记忆问题.我终于找到了如何复制问题,但我不知道是什么导致它或如何解决它.
我们在Web可访问/控制器目录中有许多cfc,用于处理提交和处理.当没有方法参数直接调用cfc时,服务器开始咀嚼内存.
例如,像http://www.domain.com/controller/LoginController.cfc这样的URL 将在浏览器中运行,直到它超时./ CFIDE已被锁定,无法公开访问
所以cfexplorer没有(或不应该)可用.
我们使用FusionReactor来监控我们的实例.我们的服务器设置为20GB的堆空间.在加载应用程序后重新启动时,内存将巡航大约800MB.
在正常流量的情况下,内存将在5GB到10GB之间波动,并定期进行垃圾回收.一段时间后,服务器最终达到98%的容量.它往往会在那里运行
有时可能会持续几个小时甚至几天,直到一些交通高峰推动它并发生一个外部错误.垃圾收集没有恢复内存,也没有活动
FusionReactor报告的长时间运行的线程.只有服务器重启才能恢复它.
使用FusionReactor(我们刚刚安装了这是我最终对此问题有所了解)我正在检查PermGen内存空间并发现它占了
堆的85%.这似乎不对.我执行了内存转储并通过Eclipse将其加载到MAP中进行分析.我发现内存中有10个对象
测量1.7GB(1.7x10约占总堆的85%).这些对象如下所示:
Class Name | Shallow Heap | Retained Heap | Percentage byte[1769628928] @ 0x4d963b198 ...128.................POST......../controller/LoginController.cfc......../controller/LoginController.cfc........173.14.93.66........173.14.93.66........www.domain.com........443........HTTP/1.1.......;D:\websites\domain\system\controller\Lo...| 1,769,628,944 | 1,769,628,944 | 8.60%
所以我在我们的一台服务器上重启了CF. 检查了FusionReactor并且没有看到内存使用情况.然后去浏览器并首先调用cfc:
http://www.domain.com/controller/LoginController.cfc?method=foo
这导致onMissingMethod处理程序正确地踢和重定向到适当的错误页面而没有服务器效果.
但后来称之为:
http://www.domain.com/controller/LoginController.cfc
导致页面挂起.FusionReactor报告没有活动请求,即使其中一个正在运行,这就是我们无法在问题发生时识别问题的原因.更糟糕的是,刷新内存会使其慢慢增加十分之一个百分点而没有报告活动.服务器上的超时设置为5分钟.我假设它最终会被杀死,然后以1.7GB的身份成为孤儿.这并没有降低服务器的速度,只是将内存以3GB的平均值运行,而垃圾收集没有任何恢复.这似乎解释了为什么随着时间的推移,随机调用这些URL会慢慢咀嚼并保留在内存中.
接下来,我从多个浏览器选项卡调用了URL.这几乎瞬间将记忆飙升至98%.尽管有超过15个浏览器标签在运行,但FusionReactor现在显示了两个长时间运行的请求10秒并攀升.强行杀死线程似乎无能为力.只有服务器重启才能解决问题.
所以现在我已经明确地确定了这个问题(幻像线程在PermGen堆中创建巨大的孤立对象)以及如何复制问题.
如何或为何直接向cfc提出请求我不知道.可能是机器人或偶尔奇怪的浏览器行为.
所有巨大的对象都是jrun.servlet.jrpp.ProxyEndpoint的实例.
具体是什么导致了这个问题,我该如何解决它.
这是运行Java 1.7.0_25的Win2003服务器上的CF9.01 Standard.
谢谢!