1

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

仅当我在加载模板中调用 cfscript 函数时才会发生这种“占用内存”。如果我只是加载模板而不调用函数,则类对象被 GC 处理并且不会发生 OOM 错误。

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

4

1 回答 1

2

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

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

于 2011-10-04T13:19:07.940 回答