我有一个小java应用程序运行一组计算繁重的任务.为了处理任务,我使用外部库,它通过本机方法和一些C代码完成大部分计算.不幸的是,在解决了一个任务之后,库会遭受大量内存泄漏,因此每个应用程序执行只能解决一个任务.
内存问题对于来自库的编码器是已知的,但尚未修复,也许永远不会(它与java garbage collector未正确使用本机界面有关).由于此特定库没有其他选择,我正在寻找通过顺序执行应用程序来解决任务的选项.
目前,我有一个bash包装器脚本,它获取了应该执行的任务列表,并且脚本调用应用程序的每个任务都只执行这个单一任务.
由于任务往往需要从以前的任务的结果,这涉及到serializing与deserializing执行结果的文件.这对我来说似乎不是好习惯,也因为用户基本上没有办法与程序控制流程进行交互.
有没有人知道如何在单个Java应用程序中执行此顺序任务?我想这将涉及为每个任务执行启动一个新的JVM,希望只传递任务结果而不是从新JVM到我的应用程序的内存泄漏.
编辑提供更多信息:
更改问题的根源:不幸的是,库不是开源的,我既没有访问本机方法也没有访问java接口api.
新进程/ JVM:在此上下文中是否相同?我对java进程api或启动新JVM没有多少经验.我的假设是,这将涉及main使用自己的函数启动一个单独的java程序ProcessBuilder.start()?
数据交换:只有几个kilobytes性能不是问题.仍然,没有文件的解决方案将是更可取的,但如果我理解正确memory mapped files也使用本地文件.另一方面,插座听起来很有前途.
有趣的是,我遇到了同样的问题.根据定义,您需要接受任何最佳实践,或者不得不使用必须使用但无法升级的错误库.
我们提出的解决方案是在它自己的进程中隔离对库的调用.这个过程是主过程的孩子.主进程包含良好的代码,而子进程包含错误.然后,我们能够跟踪子进程的调用次数,并在达到一定数量后将其拆除.我们知道在子进程损坏之前我们可以使用X调用.
由于我们的问题的性质,提出一个新的过程使我们能够在重复之前进行另一次X调用.
在成功调用时,任何状态都返回到主进程.在不成功的调用期间收集的任何状态都被丢弃,我们又重新开始了.
同样,以上都不是"好"但它对我们有用.
对于它的价值,如果我再次这样做,我会使用Akka和远程演员,这将使所有子流程,远程处理等更加简单.
| 归档时间: |
|
| 查看次数: |
641 次 |
| 最近记录: |