2011-03-27 58 views
0

我想用Unix exec这个新的替换当前的Java进程。这里已经有了一个similar question,但我更喜欢一个尽可能少使用内存的解决方案(accepted answer建议使用ClassLoader,这可能导致内存泄漏;一个类似的简单解决方案就是使用另一个进程来启动正确的)。它肯定可以使用JNI以一种依赖于平台的方式完成,我认为我可以在Unix上完成它(而Unix的solution似乎已经存在),但我几乎对相应的Windows API几乎一无所知。我应该拨打哪些Windows功能?有没有人已经做到了?如何使用JNA/JNI替换Windows中的当前Java进程?

+0

您是否正在启动另一个JVM进程?如果是这样,你担心什么内存效率低下? – 2011-03-27 15:46:39

+0

使用Unix exec解决所有问题;关于内存消耗的评论涉及纯Java解决方案。 – maaartinus 2011-03-27 15:56:55

回答

0

在Windows中,有很多子系统可以选择在基本操作系统上运行,因此它有助于了解您的目标。例如,如果你可以使用C运行时库,那么你可以使用_exec()系列的函数,它们和unix兄弟很相似。也许你可以使用这些修改jniexec来使用windows。

+0

你写过“如果你可以使用C运行库” - 我应该怎么知道?如果我想在您的计算机上运行我的应用程序(运行Windows XP,Vista或7;我不在乎旧版或异形版),该怎么办? AFAIK,用JNI我需要打包一个包含调用'_exec'的小DLL,还有更多? – maaartinus 2011-03-27 16:33:31

+0

我不是所有可以获得C运行时库的专家。当然,一种方法是使用Visual Studio来构建库。 [Wikipedia](https://secure.wikimedia.org/wikipedia/en/wiki/Microsoft_Windows_library_files#Msvcrt.dll)在这个主题上有一些话。 – 2011-03-27 17:22:47

+0

Windows中_exec()的行为与POSIX API的行为非常不同。最值得注意的是,它不会重用相同的PID,所以父进程会认为子进程已经终止。 – 2011-05-22 23:23:51

0

Win32 API不包含'exec'的概念。 POSIX API的确如此。低级别的WinNT API具有构建块,但使用它们相当复杂,并且至少在过去,需要求助于未公开的功能。

相关问题