0

再会,

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

我知道我可以修改代码,并等待它再次崩溃(或不崩溃),但我更愿意确切地了解问题所在,而不是使用试错法。

谢谢你。

4

3 回答 3

4

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

您几乎可以肯定地执行以下操作,但如果您愿意:

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

这应该使您能够在线程出错时停止线程并检查变量。您的代码中的某些内容似乎正在创建一个 8.3 meg 字符串。能够检查内存可能会有很大帮助。

于 2013-03-08T15:49:55.967 回答
3

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

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

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

于 2013-03-08T12:18:13.173 回答
1

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

它管理自己的java.io.CharArrayWriter实现,参见第 88 行,当 char[] 变满时,它的大小将翻倍。

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

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

于 2013-03-12T04:06:46.720 回答