[java] 동일한 시스템에서 여러 Java 프로그램이 실행되는 경우

각 Java 애플리케이션은 특정 Java Virtual Machine 인스턴스에서 실행됩니다. 나는 아래 측면에서 정말로 혼란스러워하고 인터넷 검색은 나를 더욱 혼란스럽게 만들었다. 다른 사이트의 다른 기사.

  1. Java로 작성된 웹 서비스가있는 경우 실행하려면 JVM 인스턴스가 필요합니다. 그러면 JVM을 데몬 프로세스로 만들 수 있습니까?

  2. 다른 자바 애플리케이션을 실행할 때 그렇다면이 JVM 인스턴스를 사용하거나 새 인스턴스를 생성합니까?

  3. 모든 기계에서 사용 가능한 주 메모리는 일정합니다. 초기 힙 크기를 제공하지 않고 동시에 n 개의 Java 프로세스를 시작할 때 힙 크기는 프로세스간에 어떻게 분산됩니까?

  4. n 개의 JVM 인스턴스를 관리하는 프로세스가 있습니까? 아니면 OS 자체에서 관리합니까?

  5. GC 중에 stop-the-world가 발생하면 다른 JVM 인스턴스 (내가 생각하는 다른 스레드)가 영향을 받습니까?



답변

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에서 독립적으로 작동합니다.


답변

  1. 보다 Java 프로그램을 데몬 화하는 방법을 .
  2. JVM의 새 인스턴스가 생성됩니다.
  3. 다른 모든 프로세스간에 메모리를 공유하는 것과 같은 방식
  4. O / S에서 관리
  5. 다른 인스턴스는 영향을받지 않습니다.

인스턴스가 작업을 조정해야하는 경우 다른 인스턴스를 실행 / 중지하는 단일 기본 인스턴스를 만들 수 있습니다.

여러 JVM 인스턴스가 필요한 이유를 설명하지 않았습니다. 아마도 단일 인스턴스가 더 잘 작동 할 것입니다.


답변