【发布时间】:2011-05-05 13:15:25
【问题描述】:
始终如一,我能够在 ColdFusion 9.01 上使用以下代码生成 Java Heap Space OutOfMemory 异常(未尝试过早期版本):
<cfset uuidGenerator = createObject("java", "java.util.UUID")>
<cfset transient = structNew()>
<cfloop from="1" to="100000" index="index">
<cfset transient[uuidGenerator.randomUUID().toString()] = true>
</cfloop>
上面的代码使用 Java UUID 类,因为它比 ColdFusion 的更快。请求后结构本身不存在(即它不在某些持久范围内,例如application)。
作为测试,我在初始化服务器后生成了一个堆转储。然后我多次运行此代码,并通过 jConsole 看到终身代填充。之后,我运行另一个堆转储。使用 Eclipse 内存分析工具的泄漏报告,我可以看到一个基于 coldfusion.util.Key 的大对象。
我在这里询问是希望其他人遇到类似的问题,如果是这样,他们为解决这个问题做了什么。
【问题讨论】:
-
不是答案,但我不确定 java.util.UUID 现在是否快得多。在 CF8 上是这样,但在 9+ 中,本地 UUID 创建速度快了 1000 倍。
-
您能否使用本机 UUID 重现内存泄漏,还是仅使用 Java UUID?
-
我还想问一下——您是否认真使用了一个包含 100K 键的结构?
-
@CF Jedi Master:不,我没有使用包含 100K 键的结构。这个测试用例改进了很多试验,检查堆转储时将应用程序置于负载下并注意到这个 Coldfusion.util.Key 作为根。
-
大约 2 个月前我已经对此进行了一些测试,我可以发誓差异可以忽略不计 - 但这是惊人的。仍然 - 我想不出很多次我需要那么多该死的 UUID。 @orangepips - 在这一点上,我唯一能建议的就是提交一个错误。也可以尝试使用 java 哈希映射而不是结构来查看问题是否消失。如果您对此感到痛苦,那么哈希映射可能是一种临时解决方法,直到 Adobe 可以修补它。