调用Java + JNA时ColdFusion内存泄漏

时间:2015-01-27 17:35:31

标签: java c++ dll memory-leaks coldfusion

ColdFusion在第二次尝试使用Java类时死亡(有内存泄漏等)。 Java类是wkToHtmltoPDf dll的包装器。它使用JNA Native库与从c ++编译的dll接口;因此执行跟踪看起来像这样:

ColdFusion - > Java - > JNA - > wkToHtmltox.dll(C ++)

第一次运行时一切正常。但是,如果我再次尝试访问该页面,ColdFusion服务器将崩溃。我必须手动重启ColdFusion服务器才能重新启动它。此外,服务器刚刚死亡而不会在日志中出现任何类型的错误。窗口事件日志表明错误模块是C:\ Windows \ SYSTEM32 \ ntdll.dll。起初,我确信JNA如何与dll或DLL本身的一些错误进行交互是一个问题。但有趣的是,我可以通过让ColdFusion冷加载库来实现它。

我的coldfusion文件如下所示:

var pdf =CreateObject("java", "pdf");
pdf.open("http://www.google.com","c:\test.pdf");
pdf.setOrientation("Landscape");
pdf.convert();
pdf = JavaCast( "null", 0 );

pdf是使用Application.cfc javaSettings向ColdFusion注册的java类。如上所述,pdf类只是dll的包装器。如上所述,cfml将在第二次运行时崩溃。但是,如果我要注释第2-4行,运行一次然后取消注释这些行,那么它将在第二次,第三次和第四次运行时正常工作。此时无论cfml运行多少次都不会崩溃。这可以工作直到coldfusion服务器重新启动。然后它将恢复为第一次运行,在第二次运行时崩溃。

谜语我哦,Riddler?

现在我说内存泄漏。但是在第二次尝试时它只有800mb到1400mb。我已经给它2gb工作,它从来没有利用它。 CPU使用率没有高峰。它就死了。如果我注释掉最后一行,那么可能需要10秒才能死掉。如果我把它留在那里它通常会立即死亡。

您可以在此处查看我的Java代码:ideone.com/mJjOBT

Microsoft事件信息:pastebin.com/sWHz7SaX

0 个答案:

没有答案