![JVM 데몬이 있나요?](https://linux55.com/image/21418/JVM%20%EB%8D%B0%EB%AA%AC%EC%9D%B4%20%EC%9E%88%EB%82%98%EC%9A%94%3F.png)
OS 데몬으로 실행되고 새 프로세스가 시작되어야 할 때 분기되는 JVM이 있습니까(예: Android의 init 또는 zygote 프로세스와 같은)? 그렇지 않다면 왜 안 됩니까? 나는 JVM의 데몬 스레드에 대해 말하는 것이 아닙니다.
JVM 시작 시간이 매우 느리고 스크립팅에 큰 부담을 주기 때문에 이 질문을 드립니다.
답변1
JVM 시작 시간은 매우 느리며 스크립팅에 큰 영향을 미칩니다. . . Java 프로세스 시작 시간을 크게 최적화합니다.
다른 답변은 유용한 고려 사항인 범용 앱 출시에 대한 질문에 대한 답변입니다.
그러나 주요 문제는 Java 애플리케이션 시작 성능과 jvm 시작에 따른 오버헤드인 것 같습니다. 이것은 나의 질문이기도 했다. 나는 이것을 찾았다:
사용자 분리 보안을 희생하려는 경우 다음을 확인하세요.엄청나게 빠른 Java, Nailgun:
Nailgun은 JVM 시작 오버헤드를 발생시키지 않고 명령줄에서 Java 프로그램을 실행하기 위한 클라이언트, 프로토콜 및 서버입니다. 프로그램은 서버(Java로 구현)에서 실행되고 모든 I/O를 처리하는 클라이언트(C로 작성)에 의해 트리거됩니다.
답변2
Android는 단일 Zygote 프로세스를 사용하여 새 애플리케이션을 포크합니다. 이러한 최적화는 모든 Android 애플리케이션이 동일한 환경에서 실행되기 때문에 가능합니다. 애플리케이션을 실행하기 위해 수행할 작업(주로 사용자 설정 및 애플리케이션 코드 로드)이 거의 없습니다. 이 최적화는 할 일이 거의 없기 때문에 효과적입니다. 특히 Zygote 프로세스가 이미 라이브러리에 연결되어 있기 때문입니다.
UNIX 시스템에서는 Zygote의 가정이 충족되지 않습니다. 각 프로세스는 자체 환경 변수, 자체 열린 파일, 자체 사용 제한, 자체 사용자 및 그룹 등으로 시작됩니다. 이러한 속성을 모두 한 프로세스에서 다른 프로세스로 전송할 수는 없습니다. 일부를 전송할 수는 있지만 시작 시간이 추가로 소요됩니다. 또한 다양한 애플리케이션은 다양한 라이브러리를 사용합니다. 각 애플리케이션은 자체적으로 로드해야 합니다. Zygote와 같은 최적화는 일반적으로 불가능하며, 가능하더라도 많은 경우 실제로 도움이 되지 않습니다.
데몬 역할을 하는 Java 프로그램을 작성할 수 있습니다. 애플리케이션별로 관리해야 합니다. 당신(당신)은 할 수 있어요너의 어플리케이션데몬으로 시작되어 새 요청이 수신되면 분기됩니다. 분할되었을 때 무엇을 할지 결정하는 것은 귀하에게 달려 있습니다.
답변3
Java 프로그램을 포함한 모든 프로세스는 데몬으로 실행될 수 있습니다. 실제 질문은 Java 구현에 "적절한 데몬"(예: 신호 처리, 세션/프로세스 그룹 처리 등)을 만들기 위한 모든 시스템 호출이 있는지 여부입니다. 한 번 살펴보고 싶을 수도 있습니다자바 데몬 API.
게다가 운영체제부터분기실행 중인 프로그램의 복사본이 생성되며 시작 비용은 없으며 운영 체제 내에서 새로운 프로세스 데이터 구조를 생성하는 데 드는 비용만 발생합니다. 후속 작업에는 exec
시작 비용이 발생할 수 있습니다 . 이미 안정적인 API가 있기 때문에 Java 프로그램은 일반적으로 포크 대신 스레드를 사용합니다.
답변4
실제로 JBoss와 같은 애플리케이션 서버는 사용자가 요구하는 것과 유사한(동일하지는 않음) 기능을 제공합니다. 즉, Java 프로세스가 백그라운드에서 실행되고 하위 애플리케이션을 시작하도록 지시할 수 있습니다. 그러나 이 접근 방식의 단점은 하위 응용 프로그램이 별도의 프로세스로 시작되지 않으므로 안전하게 분리할 수 없다는 것입니다. 즉, 하나의 가상 머신이 충돌하거나 System.exit()를 호출하거나 모든 스레드를 Interrupt()하기로 결정하면 다른 모든 스레드는 중단됩니다. 하위 애플리케이션도 영향을 받습니다.