Unix exec처럼 현재 Java 프로세스를 새로운 것으로 교체하려고합니다. 이미 similar question이 이미 있지만 가능한 한 적은 메모리를 사용하는 솔루션을 선호합니다 (accepted answer은 메모리 누수로 이어질 수있는 ClassLoader
을 사용하는 것이 좋습니다; 유사한 간단한 솔루션은 다른 프로세스를 시작하는 것입니다. 적절한 것). JNI를 사용하여 플랫폼에 의존하는 방식으로 확실하게 수행 할 수 있습니다. Unix에서이 작업을 수행 할 수 있다고 생각합니다. Unix의 경우 solution이 이미 존재하는 것 같습니다. 그러나 해당 Windows API에 대해서는 거의 알지 못합니다. 어떤 Windows 기능을 호출해야합니까? 아무도 이미 해본 적이 있습니까?JNA/JNI를 사용하여 Windows에서 현재 Java 프로세스를 바꾸는 방법은 무엇입니까?
답변
Windows의 경우 기본 OS에서 실행되는 여러 하위 시스템이 있으므로 목표로하는 것에 대해 어느 정도 이해할 수 있습니다. 예를 들어 C 런타임 라이브러리를 사용할 수 있다면 유닉스 계열과 매우 유사한 기능을 가진 _exec()
패밀리를 사용할 수 있습니다. jniexec을 사용하여 창을 사용하도록 작업 할 수 있습니다.
"C 런타임 라이브러리를 사용할 수있는 경우"라고 썼습니다 - 어떻게 알 수 있습니까? 컴퓨터 (Windows XP, Vista 또는 7을 실행하며 나이가 많거나 이국적인 버전은 신경 쓰지 않아도 됨)의 앱에서 실행하고 싶다면 어떻게해야합니까? AFAIK, JNI와 함께'_exec'에 대한 호출을 담고있는 작은 DLL을 패키징 할 필요가 있습니다. – maaartinus
저는 C 런타임 라이브러리를 얻을 수있는 모든 방법에 대한 전문가가 아닙니다. 확실히 한 가지 방법은 Visual Studio를 사용하여 라이브러리를 만드는 것입니다. [Wikipedia] (https://secure.wikimedia.org/wikipedia/en/wiki/Microsoft_Windows_library_files#Msvcrt.dll)에는이 주제에 대한 몇 가지 단어가 있습니다. –
Windows에서 _exec()의 동작은 POSIX API의 동작과 약간 다릅니다. 특히, 동일한 PID를 재사용하지 않으므로 상위 프로세스는 하위 프로세스가 종료되었다고 생각합니다. –
Win32 API에는 'exec'개념이 없습니다. POSIX API 않습니다. 로우 레벨 WinNT API는 빌딩 블록을 가지고 있지만 사용하기가 상당히 복잡하며 적어도 과거에는 문서화되지 않은 기능을 사용해야했습니다.
다른 JVM 프로세스를 시작 하시겠습니까? 그렇다면 어떤 비효율적 인 메모리가 걱정됩니까? –
Unix를 사용하면 exec가 모든 문제를 해결합니다. 메모리 소비에 대한 언급은 순수 자바 솔루션에 관한 것이다. – maaartinus