我的 CF 8 服务器上出现“OutOfMemoryError: PermGen space”错误。在我的应用程序中,1000 个模板被加载到同一个局部变量中(用于测试目的),因此一旦加载了下一个模板,前一个模板应该可用于 GC - 但这不会发生。我得到了一个内存转储,并用 jhat 查看了它。我看到的是它加载了数千个模板,每个模板都有自己的 TemplateClassLoader 实例。在 TemplateClassLoader 中,它自身有一个对所有 TemplateClassLoader 实例的静态引用(同样来自 jhat)。可能正因为如此,实例都保存在内存中,所以类对象在 permgen 中不能被 GC。
仅当我在加载模板中调用 cfscript 函数时才会发生这种“占用内存”。如果我只是加载模板而不调用函数,则类对象被 GC 处理并且不会发生 OOM 错误。
知道 TemplateClassLoader 上的(出现的)静态引用发生了什么吗?