Coldfusion TemplateClassLoader是否保留类装入器实例?

Coldfusion TemplateClassLoader是否保留类装入器实例?,coldfusion,permgen,Coldfusion,Permgen,我的CF8服务器上有一个“OutOfMemoryError:PermGen space”错误。 在我的应用程序中,1000个模板被加载到同一个局部变量中(用于测试),因此,一旦加载了下一个模板,前一个模板应该可用于GC,但这不会发生。 我得到一个内存转储,并与jhat一起查看。我看到的是它加载了上千个模板,每个模板都有自己的TemplateClassLoader实例。在TemplateClassLoader中,有一个对所有TemplateClassLoader实例的静态引用(同样来自jhat)。

我的CF8服务器上有一个“OutOfMemoryError:PermGen space”错误。 在我的应用程序中,1000个模板被加载到同一个局部变量中(用于测试),因此,一旦加载了下一个模板,前一个模板应该可用于GC,但这不会发生。 我得到一个内存转储,并与jhat一起查看。我看到的是它加载了上千个模板,每个模板都有自己的TemplateClassLoader实例。在TemplateClassLoader中,有一个对所有TemplateClassLoader实例的静态引用(同样来自jhat)。可能正因为如此,实例保存在内存中,因此类对象不能在permgen中进行GC

只有在加载后调用模板中的cfscript函数时,才会出现这种“保留内存”的情况。如果我只是加载模板而没有调用函数,那么类对象是GCed的,不会发生OOM错误

知道TemplateClassLoader上(出现的)静态引用发生了什么吗?

我已经弄明白了。 在CF admin页面Server Settings>Caching中有一个字段“Maximum number of cached templates”。它控制LRU缓存中应包含多少模板。如果模板在该缓存中,则存在对java类对象的强引用,并且不能进行GCed。 在我的CF设置中,它使用默认值1024。这就是为什么在我的测试中,1000个独特的模板没有一个获得GCD

这里有更多的信息:

EclipseMat之所以说“coldfusion.runtime.TemplateClassLoader”的3421个实例占用242105472字节,我是在寻找这个原因。这似乎就是模板缓存。非常感谢。