IT

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

lottoking 2020. 10. 10. 10:25

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


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

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


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

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

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


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


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


이론적으로는 JVM에서 여러 응용 프로그램을 사용할 수 있습니다. 실제로 다양한 방식으로 서로 제안 할 수 있습니다. 예를 들면 :

The JVM has one set of System.in/out/err, one default encoding, one default locale, one set of system properties, and so on. If one application changes these, it affects all applications.
Any application that calls System.exit() kills all applications.
If one application thread goes wild, and consumes too much CPU or memory it will affect the other applications too.

전체


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


짧은 대답 : 종종 그렇습니다. 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리턴 된 행을 계산합니다.

참고 URL : https://stackoverflow.com/questions/5947207/is-there-one-jvm-per-java-application