2011-09-29 47 views
1

我的CF 8服务器上出现“OutOfMemoryError:PermGen space”错误。 在我的应用程序中,1000个模板被加载到相同的局部变量中(用于测试目的),因此一旦下一个加载,之前的一个应该可用于GC - 但这不会发生。 我得到了内存转储,并用jhat查看它。我看到的是它加载了1000个模板,每个模板都有自己的TemplateClassLoader实例。在TemplateClassLoader中,它自身有一个对所有TemplateClassLoader实例的静态引用(同样来自jhat)。可能因为这个原因,这些实例被保存在内存中,所以类对象不能成为permgen中的GC。Coldfusion TemplateClassLoader是否支持类加载器实例?

只有当我在模板中调用cfscript函数后,才会发生这种“内存占用”。如果我只加载模板但不调用该函数,则类对象将被GCed并且不会发生OOM错误。

任何想法在TemplateClassLoader上(出现)静态引用发生了什么?

回答

2

我已经想通了。 在CF管理页面的服务器设置>缓存中有一个字段“最大缓存模板数量”。它控制着LRU缓存中应该有多少个模板。如果模板位于该缓存中,则会强烈引用java类对象,并且不能被GCed。 在我的CF设置中,它使用默认值1024.这就是为什么在我的测试中,1000个独特模板没有得到GCed。

有一点这里更多的信息: http://blogs.sanmathi.org/ashwin/2006/07/12/tangling-with-the-template-cache/

+0

我碰到这个寻找的理由来为什么Eclipse的MAT说“的‘coldfusion.runtime.TemplateClassLoader’占据242105472个字节3421个实例”。看起来这是模板缓存。谢谢。 –