2011-03-27 64 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具有構建塊,但使用它們相當複雜,並且至少在過去,需要求助於未公開的功能。

相關問題