【发布时间】:2014-01-10 18:36:51
【问题描述】:
我们遇到了 Java 内存问题。使用 JRocket,我看到堆上的 char 数组看起来像“--->”(ColdFusion 结束注释标记)占用 64 Meg。为什么会发生这种情况,更重要的是我该如何追踪并摆脱它?
更新:好的,我找到了发生这种情况的位置,但没有找到原因。有问题的代码是我在标签后错误地留下了结束注释标签的地方: “--->” 为什么“--->”会出现在我不知道的内存中。但是线程内存消耗呈指数增长。 JVM 可以在线程内执行垃圾收集吗?它使用 CFC,其中所有内容都分配给 var 本地结构。这是 CF 8 顺便说一句。
【问题讨论】:
-
您使用的是什么版本的 Java?你用的是什么版本的CF?您是否尝试过 CF 服务器监控?
-
JVM 可以对堆中的任何内容执行垃圾收集。如果线程(GC Root)仍然包含对对象的硬引用,则不会收集它。 “--->”很有趣——可能是解析器错误导致无限循环。您确定这是内存泄漏的根源而不是红鲱鱼。 Jrockit 有一份关于消耗最多堆的对象的报告。此外,您还可以查看哪些对象数量上升最快。
-
布拉德:我的回复被截断了。 “--->”遵循 cfthread 声明,所以不,我不认为它本身就是原因。线程/循环中的某些东西不断增长。该线程有一个循环,循环中的所有内容都是本地 var 范围的。但是 jRocket 只是向我展示了 char 数组(线程是 char 数组??)而不是线程内部的东西。也许我可以在 x 交互后 cfdump 本地范围。带有“--->”(已删除)的字符数组是趋势最快的。
-
Brad:我问过 JVM 是否可以在线程内执行垃圾收集。答案是明确的“不”。线程受到 GC 保护,直到它被加入或终止。线程使用堆栈,而不是堆内存,因此该站点的名称
标签: java debugging coldfusion