如何在Coldfusion 8中执行CFX标签?

时间:2012-05-18 15:35:04

标签: coldfusion coldfusion-8 jrun

在我的公司,我们最近遇到了一些记忆问题。我们做的一件事是增加了JRUN中的堆大小,但现在我们注意到了一些副作用。

其中一个是处理图像的CFX标签。当我们使用它时,它无法加载我们有时提供的文件。我们当前的想法是,为了处理图像,必须将整个图像加载到存储器中。它似乎只会在大文件上抛出错误,这需要200多MB的内存来存储整个文件。

我想知道的是Coldfusion如何处理CFX标签的加载和执行。由于CFX标签特别是用C ++编写的,我认为它不一定会使用Coldfusion堆(因为它只存储Java数据),而且当我们处理某些东西时,我们没有看到堆峰值。

我想主要的问题是如何执行CFX:它是作为JRUN下的线程运行的,还是创建了一个在自己的用户空间中运行的本机Windows进程?并且,如果它确实在JRUN下运行,那么在执行时它会使用什么内存空间,有没有办法监视它?

2 个答案:

答案 0 :(得分:1)

CFX肯定在JRUN下作为一个线程运行,数据通过JNI层从Java到C ++编组。所以是的,它会使用默认文件open / read(在封面下)将整个图像加载到堆中,然后将二进制文件传递给C ++标记。在我看来,处理大型图像文件(或一般的大文件)一直是CF的问题。有一些用于图像处理的“纯Java”解决方案可以提供更好的性能 - 或者你可以使用类似“imagemagik”的东西,它将文件名和路径传递给shell,而单独执行。这是我的看法。

答案 1 :(得分:1)

我认为如果你运行32位进程,它只能访问2gig。如果堆是1gig,那么非堆内存将是60-200 + meg,然后为进程正在运行的每个线程添加内存(当你聚集时线程数会更高)然后有时候没有你的过程中留下了大量的内存空间。另外,据我所知,各种DLL都被映射到内存范围上部某处的内存空间,这意味着当你的图像处理标签试图分配一大块连续内存时(在我的猜测之外) ,没有剩下一个块。这个答案有些推测,所以不要把它当作福音,但是可能值得看看可以直观显示进程内存映射的程序。