1) Java로 작성된 웹 서비스가있는 경우 실행하려면 JVM 인스턴스가 필요합니다. 그렇다면 JVM을 데몬 프로세스로 만들 수 있습니까?
예, 그럴 수 있습니다. 수행 방법은 O / S 및 웹 서버 컨테이너 자체에 따라 다릅니다.
2) 다른 Java 응용 프로그램을 실행할 때 그렇다면이 JVM 인스턴스를 사용하거나 새 인스턴스를 생성합니까?
아니요. 각 Java 애플리케이션은 독립적 인 JVM을 사용합니다.
각 JVM은 별도의 프로세스이므로 스택, 힙 등을 공유하지 않습니다. (일반적으로 공유 할 수있는 유일한 것은 일반 프로세스가 코드 세그먼트를 공유 할 수있는 것과 같은 방식으로 코어 JVM 및 원시 라이브러리의 코드를 보유하는 읽기 전용 세그먼트입니다.)
3) 모든 기계에서 사용 가능한 메인 메모리는 일정합니다. 초기 힙 크기를 제공하지 않고 n 개의 Java 프로세스를 동시에 시작할 때 힙 크기는 프로세스간에 어떻게 분산됩니까?
크기를 지정하지 않은 경우 힙 크기를 결정하는 메커니즘은 사용중인 JVM / 플랫폼 / 버전 및 "클라이언트"또는 "서버"모델 (핫스팟 JVM 용)을 사용하는지 여부에 따라 다릅니다. 휴리스틱은 다른 JVM의 수나 크기를 고려하지 않습니다.
참조 : https://stackoverflow.com/a/4667635/139985
실제로는 힙 크기를 직접 지정하는 것이 좋습니다.
4) n 개의 JVM 인스턴스를 관리하는 프로세스가 있습니까 아니면 OS 자체에서 관리합니까?
둘 다 아닙니다. JVM 인스턴스의 수는 프로세스를 시작할 수있는 다양한 작업에 의해 결정됩니다. 예 : 데몬 스크립트, 명령 스크립트, 명령 줄에 명령을 입력하는 사용자 등. 궁극적으로 OS는 리소스가 부족한 경우 더 이상 프로세스 시작을 거부 할 수 있지만 JVM은 다른 프로세스와 다르게 처리되지 않습니다.
5) GC 중에 stop-the-world가 발생하면 다른 JVM 인스턴스 (내가 생각하는 다른 스레드)가 영향을 받습니까?
아니요. JVM은 독립적 인 프로세스입니다. 변경 가능한 상태를 공유하지 않습니다. 가비지 콜렉션은 각 JVM에서 독립적으로 작동합니다.