Coldfusion运行时源代码

时间:2013-03-07 23:49:51

标签: java coldfusion decompiling coldfusion-8 cfml

美好的一天,

我想知道是否可以查看/调试/入侵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'函数调用。

我知道我可以修补代码,并等待它再次崩溃(或不会),但我更愿意看到问题的确切原因,而不是使用试错。

谢谢。

3 个答案:

答案 0 :(得分:4)

第一个选项是设置HeapDumpOnOutOfMemoryError,然后在JHAT中打开转储以查找占用空间的内容。鉴于错误代码正在尝试复制大缓冲区,应该已经有一个已经在内存中。这应该指向错误的方向

你几乎肯定会做以下事情,但如果你想:

  • 安装Eclipse
  • 安装一个为其存在的java反编译器
  • 创建新项目
  • 将cfusion.jar添加到项目
  • 阅读代码
  • 配置ColdFusion以侦听端口以进行调试(-Xdebug -Xrunjdwp:transport = dt_socket,server = y,suspend = n,address = 1044)
  • 设置一些断点
  • 使用上面的端口
  • 在eclipse中设置远程调试会话

这应该让你能够在错误和检查变量时停止线程。代码中的某些东西看起来正在创建一个8.3兆字节的字符串。能够检查记忆可能会有很大帮助。

答案 1 :(得分:3)

获取免费的Java反编译器:http://jd.benow.ca/

在ColdFusion安装目录中搜索cfusion.jar文件。

用反编译器打开它。 CharBuffer应该在那里。

答案 2 :(得分:1)

最后,它归结为Coldfusion如何缓冲其页面。

它管理自己的java.io.CharArrayWriter实现,并看到第88行,它会使char []的大小加倍。

对我来说似乎很合理。但是我们的一些页面非常大,8mb * 20并发页面请求意味着大量的RAM活动。

我只需要努力减少页面的大小......