실행중인 모든 Java 애플리케이션에서 동일한 JVM을 사용합니까? 아니면 'Java 애플리케이션 당 하나의 JVM'이 적용됩니까? (예를 들어 응용 프로그램은 IntelliJ IDEA, 서버 및 NetBeans)
또한 할당 된 JVM과 각 Java 응용 프로그램에서 사용하는 프로세스간에 연결이 있습니까?
답변:
일반적으로 각 애플리케이션은 자체 JVM 인스턴스와 자체 OS 수준 프로세스를 가지며 각 JVM 인스턴스는 서로 독립적입니다.
여러 JVM 인스턴스가 일부 데이터 / 메모리를 공유 할 수 있지만 응용 프로그램에 사용자가 볼 수있는 영향을주지 않는 Class Data Sharing 과 같은 구현 세부 정보 가 있습니다 (개선 된 시작 시간 제외).
그러나 일반적인 시나리오는 여러 웹 응용 프로그램을 실행하는 Glassfish 또는 Tomcat과 같은 단일 응용 프로그램 서버 (또는 "웹 서버")입니다. 이 경우 여러 웹 애플리케이션이 JVM을 공유 할 수 있습니다.
이론적으로는 JVM에서 여러 응용 프로그램을 실행할 수 있습니다. 실제로 그들은 다양한 방식으로 서로 간섭 할 수 있습니다. 예 :
- JVM에는 하나의
System.in
/out
/ 세트err
, 하나의 기본 인코딩, 하나의 기본 로케일, 하나의 시스템 특성 세트 등이 있습니다. 한 응용 프로그램이이를 변경하면 모든 응용 프로그램에 영향을줍니다.- 호출하는
System.exit()
모든 응용 프로그램은 모든 응용 프로그램을 종료합니다.- 하나의 애플리케이션 스레드가 거칠어지고 너무 많은 CPU 또는 메모리를 소비하면 다른 애플리케이션에도 영향을 미칩니다.
짧은 대답 : 종종 그렇습니다. 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) 응용 프로그램 서버의 웹 응용 프로그램 사용자는 실제로 명령 줄을 통해 로컬에서 사용할 수있는 것과 동일한 '핵심'응용 프로그램을 사용할 수 있습니다.
조금 늦었지만이 정보는 누군가에게 유용 할 수 있습니다. Linux 시스템에서 실행중인 JVM 수를 알고 싶다면이 명령을 시도 할 수 있습니다.
$ ps -ef | grep "[j]ava" | wc -l
ps
프로세스를 나열하고,grep
"java"를 포함하는 프로세스를 검색하고,wc
리턴 된 행을 계산합니다.