如何在Java中使用posix_spawn()

如何在Java中使用posix_spawn(),java,solaris,Java,Solaris,我继承了一个遗留应用程序,它使用ProcessBuilder.start()在Solaris 10服务器上执行脚本 不幸的是,如文档所述,由于内存问题,此脚本调用失败 Oracle建议使用posix_spawn(),因为在封面下,ProcessBuilder.start()正在使用fork/exec 我找不到任何示例(例如,如何调用“myScript.sh”) 在Java中使用posix_spawn(),甚至使用所需的包 请您给我举一个简单的例子,说明如何在Java中使用posix_spawn(

我继承了一个遗留应用程序,它使用
ProcessBuilder.start()
在Solaris 10服务器上执行脚本

不幸的是,如文档所述,由于内存问题,此脚本调用失败

Oracle建议使用
posix_spawn()
,因为在封面下,
ProcessBuilder.start()
正在使用
fork/exec

我找不到任何示例(例如,如何调用
“myScript.sh”

在Java中使用
posix_spawn()
,甚至使用所需的包


请您给我举一个简单的例子,说明如何在Java中使用
posix_spawn()

您需要先熟悉一下。了解如何从Java代码调用本机例程。一旦你们这样做了,你们可以看看这个例子,看看它是否有助于解决你们的问题。您特别感兴趣的是:

if( (RC=posix_spawn(&pid, spawnedArgs[0], NULL, NULL, spawnedArgs, NULL)) !=0 ){
    printf("Error while executing posix_spawn(), Return code from posix_spawn()=%d",RC);

}

另一种不需要JNI的方法是创建一个单独的“流程产卵器”应用程序。我可能会让这个应用程序公开一个RMI接口,并创建一个包装器对象,作为
ProcessBuilder
的替代品


您可能还想考虑让这个“SpWaWER”应用程序启动您的遗留应用程序。

< P>一个更简单的解决方案是保持代码不变,只需向服务器添加更多虚拟内存。 i、 e:

编辑:要澄清问题中的链接现在已断开:

问题是由于JVM被分叉而导致系统虚拟内存不足。例如,假设JVM使用2GB的虚拟机,则需要额外2GB的虚拟机才能在Solaris上成功使用fork。这里不涉及分页,只涉及内存保留。与默认情况下过度占用内存的Linux内核不同,Solaris确保分配的内存由RAM或交换支持。由于没有足够的可用交换,fork失败了。扩大交换允许fork在不影响性能的情况下成功。在fork之后,exec“取消保留”这个2GB的RAM,并恢复到与posix_spawn相同的情况


有关Solaris和其他操作系统下内存分配的说明,请参见此部分。

最新版本的Java 7和8内部支持
posix_spawn

命令行选项

-Djdk.lang.Process.launchMechanism=POSIX_SPAWN
或在运行时启用

System.setProperty("jdk.lang.Process.launchMechanism", "POSIX_SPAWN");
对于默认情况下哪些Java版本/操作系统组合启用了此选项,我有点困惑,但我相信您可以很快测试并发现设置此选项是否会产生影响

作为参考,要返回到旧的
fork
方法,只需使用

-Djdk.lang.Process.launchMechanism=fork
要证明在JVM版本中是否尊重此选项,请使用

-Djdk.lang.Process.launchMechanism=dummy

下次执行
exec
时会出现错误。这样,您就知道JVM正在接收此选项。

您知道此选项的任何开源实现吗?我自己即将编写一个,但如果有库的话,我宁愿使用它。op问的是如何使用posix spawn,而不是如何添加虚拟机memory@kritzikratziOP暴露了一个问题,我建议的是一个比他正在探索的更简单、更少干扰的解决方法。没有什么值得投反对票。如果速度只是一点点重要的话,那么换成硬盘是不可行的选择,这就是我投反对票的原因。此外:你的答案甚至不能解决问题,因为增加交换空间与此无关。您必须增加Xmx和Xms限制,交换空间不足可能是问题所在,也可能不是问题所在。@kritzikratzi,因为问题是关于由于JVM分叉而导致系统虚拟内存不足的问题。例如,如果JVM使用2GB虚拟机,则需要额外2GB虚拟机。这里绝对不涉及分页,只涉及内存保留。Solaris确保分配的内存由RAM或交换支持。由于没有足够的可用交换,fork失败了。扩大交换允许fork在不影响性能的情况下成功。就在fork之后,exec“取消保留”了这2GB的RAM,并恢复到与posix_spawn相同的状态。我没有尝试过这一点,但是这个服务包装库似乎提供了一个Runtime.exec()替换,支持posix_spawn。
-Djdk.lang.Process.launchMechanism=dummy