Coldfusion TemplateClassLoader 保留类加载器实例吗?
我的 CF 8 服务器上出现“OutOfMemoryError: PermGen space”错误。 在我的应用程序中,1000 个模板被加载到同一个局部变量中(用于测试目的),因此一旦加载下一个模板,前一个模板就应该可用于 GC - 但这种情况不会发生。 我得到了一个内存转储并用jhat查看了它。我看到的是它加载了数千个模板,每个模板都有自己的 TemplateClassLoader 实例。在 TemplateClassLoader 本身中,有一个对所有 TemplateClassLoader 实例的静态引用(同样来自 jhat)。可能正因为如此,实例被保存在内存中,所以类对象不能在permgen中被GC。
仅当我在加载模板后调用 cfscript 函数时,才会发生这种“保留内存”。如果我只加载模板而不调用函数,类对象将被GC,并且不会发生 OOM 错误。
知道 TemplateClassLoader 上(出现的)静态引用发生了什么吗?
I have a "OutOfMemoryError: PermGen space" error on my CF 8 server.
In my app 1000 templates were loaded into the same local variable (for testing purpose), so once the next one is loaded, the prior one should be available for GC - but this does not happen.
I got a memory dump and looked at it with jhat. What I saw was it loads the thousand templates, each with it's own TemplateClassLoader instances. In the TemplateClassLoader it self there is a static reference to all TemplateClassLoader instances (again this is from the jhat). Probably because of this, the instances are hold in memory, so the class objects can not be GC in permgen.
This "holding on memory" only happens if I call a cfscript function in the template once is loaded. If I just load the template but not calling the function, the class objects are GCed and no OOM error occurs.
Any idea what's happening on the (appeared) static reference on the TemplateClassLoader?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我已经弄清楚了。
在CF管理页面“服务器设置”>“服务器设置”缓存有一个字段“缓存模板的最大数量”。它控制 LRU 缓存中应有多少模板。如果模板在该缓存中,则存在对 java 类对象的强引用,并且无法进行 GC。
在我的 CF 设置中,它使用默认值 1024。这就是为什么在我的测试中,1000 个唯一模板都没有被 GCed。
这里还有更多信息:
http://blogs.sanmathi.org/ ashwin/2006/07/12/tangling-with-the-template-cache/
I have that figured out.
In the CF admin page Server Settings > Caching there is a field "Maximum number of cached templates". It controls how many templates should be in a LRU cache. If a template is in that cache, there is a strong reference to the java class object and can not be GCed.
In my CF setup it uses a default value of 1024. This is why in my test the 1000 unique templates none get GCed.
There is a bit more info here:
http://blogs.sanmathi.org/ashwin/2006/07/12/tangling-with-the-template-cache/