Java 애플리케이션 당 하나의 JVM이 있습니까?


91

실행중인 모든 Java 애플리케이션에서 동일한 JVM을 사용합니까? 아니면 'Java 애플리케이션 당 하나의 JVM'이 적용됩니까? (예를 들어 응용 프로그램은 IntelliJ IDEA, 서버 및 NetBeans)

또한 할당 된 JVM과 각 Java 응용 프로그램에서 사용하는 프로세스간에 연결이 있습니까?


2
이것은 좋은 질문입니다. :)
jamie

답변:


81

일반적으로 각 애플리케이션은 자체 JVM 인스턴스와 자체 OS 수준 프로세스를 가지며 각 JVM 인스턴스는 서로 독립적입니다.

여러 JVM 인스턴스가 일부 데이터 / 메모리를 공유 할 수 있지만 응용 프로그램에 사용자가 볼 수있는 영향을주지 않는 Class Data Sharing 과 같은 구현 세부 정보 가 있습니다 (개선 된 시작 시간 제외).

그러나 일반적인 시나리오는 여러 웹 응용 프로그램을 실행하는 Glassfish 또는 Tomcat과 같은 단일 응용 프로그램 서버 (또는 "웹 서버")입니다. 이 경우 여러 웹 애플리케이션이 JVM을 공유 할 수 있습니다.


21

Java 애플리케이션 당 하나의 JVM이 있습니다. 예를 들어 네트워킹과 같이 하나를 설정하지 않는 한 그들 사이에 어떤 연결도 있어서는 안됩니다. IDE 내부에서 작업하는 경우 작성하는 코드는 일반적으로 별도의 JVM에서 실행됩니다. IDE는 일반적으로 디버깅을 위해 별도의 JVM을 연결합니다. 여러 웹 애플리케이션을 다루는 경우 동일한 웹 컨테이너에 배포되면 동일한 JVM을 공유 할 수 있습니다.


12

이론적으로는 JVM에서 여러 응용 프로그램을 실행할 수 있습니다. 실제로 그들은 다양한 방식으로 서로 간섭 할 수 있습니다. :

  • JVM에는 하나의 System.in/ out/ 세트 err, 하나의 기본 인코딩, 하나의 기본 로케일, 하나의 시스템 특성 세트 등이 있습니다. 한 응용 프로그램이이를 변경하면 모든 응용 프로그램에 영향을줍니다.
  • 호출하는 System.exit()모든 응용 프로그램은 모든 응용 프로그램을 종료합니다.
  • 하나의 애플리케이션 스레드가 거칠어지고 너무 많은 CPU 또는 메모리를 소비하면 다른 애플리케이션에도 영향을 미칩니다.

8

실행중인 JVM 수는 호출 된 실행 파일의 수입니다. 이러한 각 응용 프로그램은 자체 Java 실행 파일 (Windows의 경우 java.exe / javaw.exe etx)을 호출합니다. 즉, 각 응용 프로그램은 별도의 JVM에서 실행됩니다.


8

짧은 대답 : 종종 그렇습니다. JVM 당 하나의 애플리케이션이 제공됩니다. 긴 대답 : JVM은 그런 식으로 사용할 수 있으며 이것이 최선의 선택 일 수 있지만 반드시 그럴 필요는 없습니다.

그것은 모두 당신이 '애플리케이션'이라고 생각하는 것에 달려 있습니다. IDE는 최종 사용자 (예 : 우리)에게 단일 엔터티로 제공되지만 실제로는 여러 기본 응용 프로그램 (컴파일러, 테스트 실행기, 정적 분석 도구, 패키저, 패키지 관리자, 프로젝트 / 종속성 관리 도구 등). 이 경우 IDE가 사용자가 통합 된 경험을 경험할 수 있도록하는 동시에 기본 도구의 개별적인 변덕으로부터 (어느 정도까지) 보호되는 다양한 트릭이 있습니다. 그러한 트릭 중 하나 는 별도의 JVM에서 몇 가지 작업 을 수행 하여 텍스트 파일이나 애플리케이션 수준 디버깅 기능을 통해 통신하는 것입니다.

애플리케이션 서버 (Wildfly, Glassfish, Websphere, Weblogic 등)는 다른 애플리케이션이 실행될 컨테이너 역할을하는 이유가있는 애플리케이션입니다.이 경우 한 관점에서 애플리케이션 당 하나의 JVM (예 : 하나의 JVM)이 있습니다. 전체 애플리케이션 서버를 실행하는 데 사용됨)하지만 실제로는 JVM 내에 자체적으로 포함 된 여러 애플리케이션이 있으며, 각 애플리케이션은 자체 클래스 로더에서 논리적으로 분리되어 있습니다 (우발적 인 프로세스 내 누화 가능성 감소).

그래서, 그것은 모두 당신이 무엇이라고 생각하는지에 달려 application있습니다. 순전히 "main () '이 호출 될 때 실행되는 것"에 대해 이야기하고 있다면 JVM 당 하나의 애플리케이션을보고있는 것입니다. OS가 JVM을 시작할 때 JVM은 단일 클래스의 public static void main()메서드를 실행합니다 .

그러나 애플리케이션이 점점 복잡해지기 시작하면 경계가 더 흐려집니다. Intellij 또는 Eclipse와 같은 IDE는 동일한 JVM 또는 다른 JVM에서 'javac'와 동일한 항목을 많이 재사용하고 다른 작업 (예 : 화면 다시 그리기)을 수행합니다. 그리고 (공유 JVM) 응용 프로그램 서버의 웹 응용 프로그램 사용자는 실제로 명령 줄을 통해 로컬에서 사용할 수있는 것과 동일한 '핵심'응용 프로그램을 사용할 수 있습니다.


5

공유 라이브러리가있는 모든 응용 프로그램은 해당 라이브러리의 동일한 사본을 공유합니다. Java에는 상당한 양의 공유 라이브러리가 있습니다. 그러나 저장된 일부 메모리를 제외하고는 차이점을 알 수 없습니다.


2

조금 늦었지만이 정보는 누군가에게 유용 할 수 있습니다. Linux 시스템에서 실행중인 JVM 수를 알고 싶다면이 명령을 시도 할 수 있습니다.

$ ps -ef | grep "[j]ava" | wc -l

ps프로세스를 나열하고, grep"java"를 포함하는 프로세스를 검색하고, wc리턴 된 행을 계산합니다.


0

사실 이것은 매우 혼란스러운 답을 가질 수있는 하나의 질문입니다. 짧게 유지하려면 :

  1. 예, JVM 당 Java 프로세스 당.
  2. Runtime 및 ProcessBuilder는이 규칙을 따릅니다.
  3. 리플렉션을 사용하여 jar를로드 한 다음 main을 실행하면 새 JVM이 생성되지 않습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.