【发布时间】:2014-11-21 05:35:21
【问题描述】:
我有一个小型java 应用程序运行一组计算繁重的任务。为了处理任务,我使用了一个外部库,它通过本地方法和一些C 代码完成大部分计算。不幸的是,在解决了一项任务后,该库会遭受严重的内存泄漏,因此每次应用程序执行只能解决一项任务。
库中的编码人员知道内存问题,但尚未修复,也许永远不会修复(它与 java garbage collector 无法正确使用本机接口有关)。由于这个特定的库没有其他选择,我正在寻找通过顺序执行应用程序来解决任务的选项。
目前,我有一个 bash 包装器脚本,它获取应执行的任务列表,并且对于每个任务,脚本调用应用程序并仅执行这个单一任务。
由于任务通常需要之前任务的结果,这涉及到serializing 和deserializing 执行结果到文件。这对我来说似乎不是一个好习惯,也是因为用户基本上没有办法与程序控制流进行交互。
有没有人知道如何在一个 Java 应用程序中执行这个顺序任务?我想这将涉及为每个任务执行启动一个新的 JVM,希望只将任务结果而不是内存泄漏从新 JVM 传输到我的应用程序。
编辑提供更多信息:
改变问题的根源:不幸的是,该库不是开源的,我既无法访问本机方法,也无法访问 java 接口 api。
新进程/JVM:在这种情况下是否相同?我对 java 进程 api 或启动新的 JVM 没有太多经验。我的假设是这将涉及使用
ProcessBuilder.start()启动一个具有自己的main函数的单独java 程序?数据交换:只有几个
kilobytes,所以性能不是问题。尽管如此,没有文件的解决方案会更好,但如果我理解正确memory mapped files也使用本地文件。另一方面,套接字听起来很有希望。
【问题讨论】:
-
可惜 JVM 没有相当于 AppDomain(隔离什么?).. 无论如何,提到的方法,启动一个单独的进程/JVM 并使用 IPC 传输数据,听起来像一个“合适的”破解;禁止实际使用实现一半正确的库。 (但也许有一些方法可以手动调用来释放底层资源?如果存在这些应该记录在案。)
-
不能直接调用JNI下面的支持C库吗?然后你可以更好地控制内存并切断垃圾收集器。
标签: java memory-leaks