openCL和崩溃,是否有更好的方法来查找内存泄漏? (JOCL)

时间:2011-02-01 16:27:48

标签: java memory-leaks find opencl

我一直在审核openCL的调用代码一段时间,我找不到任何内存泄漏。注意,我使用的是JOCL,所以我有一堆JUnit测试。如果我单独运行任何测试,或者如果我运行任何测试的4/5,它总是通过,但如果我在我的三个具有较弱图形卡的盒子中运行我的所有测试,它总是会失败。我认为这必须是内存泄漏问题。 openCL刚刚被泄漏了吗?有没有更好的方法来查找内存泄漏,而不仅仅是在调试器中跟踪我的代码?

我在较弱的盒子上收到此错误。如果我增加JUnit测试的内存使用量,我也可以在更强大的盒子上得到它,如果我把它做得足够高,这是预期的。当这种情况发生在我较弱的盒子上时,它将在惩罚上随机失败。如果在其之前运行所有其他测试,则1MB GPU内存测试。我正在使用Nvidia的260.19.36驱动程序。

[junit] CL_MEM_OBJECT_ALLOCATION_FAILURE
[junit] org.jocl.CLException: CL_MEM_OBJECT_ALLOCATION_FAILURE

2 个答案:

答案 0 :(得分:0)

当接近内存泄漏时(无论项目中使用了哪些框架),最好先查看一些内容。

  • 您是否收到OutOfMemoryException?如果你是,也许你没有-Xmin JMV变量集告诉JVM要开始多少内存。如果您从太少开始并且堆增长太快,您实际上可能会崩溃JVM。所以你可以尝试使用它。
  • 你知道你消耗了多少内存吗?您可以让应用程序转储当前内存使用情况或记录gc运行的次数。如果你的gc运行得非常高,你需要调整gc,或者你可能有泄漏。
  • 找一个应用程序分析器(在我们的例子中,我们是一个沉重的IBM商店,所以我们使用他们的分析器,但我相信那里有免费的)。如果您怀疑存在泄漏,这可以帮助您在常规应用程序使用期间导航堆。它将准确显示您正在使用多少堆以及哪些对象倾向于“处理”而不会被清理。

我知道这些是通用的。但是当我们怀疑内存泄漏时,它们是我们首先检查的清单。

答案 1 :(得分:0)

由于缺少动态内存的概念,OpenCL代码(内核代码)不应该为您带来任何内存泄漏。效果只能来自JOCL,Java或所用设备的底层供应商库。供应商库不太可能是原因,但新版本的驱动程序和库是猜测。

某些类在OpenCL设备上分配内存而不释放它。您确定,在抛出异常的情况下,您还可以释放OpenCL内存吗?