美好的一天,
我想知道是否可以查看/调试/入侵coldfusion.runtime源代码。
具体来说,我遇到的内存错误如下所示:
allocLargeObjectOrArray: [C, size 8388624
java.lang.OutOfMemoryError: allocLargeObjectOrArray: [C, size 8388624 at
java.util.Arrays.copyOf(Arrays.java:2882) at
java.io.CharArrayWriter.write(CharArrayWriter.java:105) at
coldfusion.runtime.CharBuffer.replace(CharBuffer.java:37) at
coldfusion.runtime.CharBuffer.replace(CharBuffer.java:50) at
coldfusion.runtime.NeoBodyContent.write(NeoBodyContent.java:254) at
[My Code]
我想知道CharBuffer正在替换什么,为什么,它正在复制什么数组以及为什么等等,以便我可以调整我的代码。
我的代码cfloop通过查询并输出其字段,包括'IIf'语句和'de'函数调用。
我知道我可以修补代码,并等待它再次崩溃(或不会),但我更愿意看到问题的确切原因,而不是使用试错。
谢谢。
答案 0 :(得分:4)
第一个选项是设置HeapDumpOnOutOfMemoryError,然后在JHAT中打开转储以查找占用空间的内容。鉴于错误代码正在尝试复制大缓冲区,应该已经有一个已经在内存中。这应该指向错误的方向
你几乎肯定会做以下事情,但如果你想:
这应该让你能够在错误和检查变量时停止线程。代码中的某些东西看起来正在创建一个8.3兆字节的字符串。能够检查记忆可能会有很大帮助。
答案 1 :(得分:3)
答案 2 :(得分:1)
最后,它归结为Coldfusion如何缓冲其页面。
它管理自己的java.io.CharArrayWriter实现,并看到第88行,它会使char []的大小加倍。
对我来说似乎很合理。但是我们的一些页面非常大,8mb * 20并发页面请求意味着大量的RAM活动。
我只需要努力减少页面的大小......