【问题标题】:Coldfusion TemplateClassLoader hold on to class loader instances?Coldfusion TemplateClassLoader 是否保留类加载器实例?
【发布时间】:2011-09-29 14:27:32
【问题描述】:

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

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

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

【问题讨论】:

    标签: coldfusion permgen


    【解决方案1】:

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

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

    【讨论】:

    • 我在寻找 Eclipse MAT 说“3,421 个“coldfusion.runtime.TemplateClassLoader”实例占用 242,105,472 个字节的原因时遇到了这个问题。这似乎是模板缓存。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    相关资源
    最近更新 更多