2011-03-27 1 views
0

Unix exec처럼 현재 Java 프로세스를 새로운 것으로 교체하려고합니다. 이미 similar question이 이미 있지만 가능한 한 적은 메모리를 사용하는 솔루션을 선호합니다 (accepted answer은 메모리 누수로 이어질 수있는 ClassLoader을 사용하는 것이 좋습니다; 유사한 간단한 솔루션은 다른 프로세스를 시작하는 것입니다. 적절한 것). JNI를 사용하여 플랫폼에 의존하는 방식으로 확실하게 수행 할 수 있습니다. Unix에서이 작업을 수행 할 수 있다고 생각합니다. Unix의 경우 solution이 이미 존재하는 것 같습니다. 그러나 해당 Windows API에 대해서는 거의 알지 못합니다. 어떤 Windows 기능을 호출해야합니까? 아무도 이미 해본 적이 있습니까?JNA/JNI를 사용하여 Windows에서 현재 Java 프로세스를 바꾸는 방법은 무엇입니까?

+0

다른 JVM 프로세스를 시작 하시겠습니까? 그렇다면 어떤 비효율적 인 메모리가 걱정됩니까? –

+0

Unix를 사용하면 exec가 모든 문제를 해결합니다. 메모리 소비에 대한 언급은 순수 자바 솔루션에 관한 것이다. – maaartinus

답변

0

Windows의 경우 기본 OS에서 실행되는 여러 하위 시스템이 있으므로 목표로하는 것에 대해 어느 정도 이해할 수 있습니다. 예를 들어 C 런타임 라이브러리를 사용할 수 있다면 유닉스 계열과 매우 유사한 기능을 가진 _exec() 패밀리를 사용할 수 있습니다. jniexec을 사용하여 창을 사용하도록 작업 할 수 있습니다.

+0

"C 런타임 라이브러리를 사용할 수있는 경우"라고 썼습니다 - 어떻게 알 수 있습니까? 컴퓨터 (Windows XP, Vista 또는 7을 실행하며 나이가 많거나 이국적인 버전은 신경 쓰지 않아도 됨)의 앱에서 실행하고 싶다면 어떻게해야합니까? AFAIK, JNI와 함께'_exec'에 대한 호출을 담고있는 작은 DLL을 패키징 할 필요가 있습니다. – maaartinus

+0

저는 C 런타임 라이브러리를 얻을 수있는 모든 방법에 대한 전문가가 아닙니다. 확실히 한 가지 방법은 Visual Studio를 사용하여 라이브러리를 만드는 것입니다. [Wikipedia] (https://secure.wikimedia.org/wikipedia/en/wiki/Microsoft_Windows_library_files#Msvcrt.dll)에는이 주제에 대한 몇 가지 단어가 있습니다. –

+0

Windows에서 _exec()의 동작은 POSIX API의 동작과 약간 다릅니다. 특히, 동일한 PID를 재사용하지 않으므로 상위 프로세스는 하위 프로세스가 종료되었다고 생각합니다. –

0

Win32 API에는 'exec'개념이 없습니다. POSIX API 않습니다. 로우 레벨 WinNT API는 빌딩 블록을 가지고 있지만 사용하기가 상당히 복잡하며 적어도 과거에는 문서화되지 않은 기능을 사용해야했습니다.