Java 어플리케이션마다 1개의 JVM이 있습니까?
모든 Java 어플리케이션에서 동일한 JVM을 실행하고 있습니까?아니면 Java 어플리케이션당 1개의 JVM이 적용됩니까?(예를 들어 IntelliJ IDEA, 서버, NetBeans 등)
또한 할당된 JVM과 각 Java 어플리케이션에서 사용되는 프로세스 간에 어떤 연관성이 있습니까?
일반적으로 각 애플리케이션은 자체 JVM 인스턴스와 자체 OS 레벨 프로세스를 가지며 각 JVM 인스턴스는 서로 독립적입니다.
여러 JVM 인스턴스가 일부 데이터/메모리를 공유할 수 있지만 사용자가 볼 수 있는 영향은 없는 클래스 데이터 공유와 같은 구현 세부 사항이 있습니다(기동 시간 단축 제외).
단, Glassfish 또는 Tomcat과 같은 단일 애플리케이션 서버(또는 "웹 서버")가 여러 웹 애플리케이션을 실행하는 경우가 일반적입니다.이 경우 여러 웹 애플리케이션이 JVM을 공유할 수 있습니다.
Java 애플리케이션당 1개의 JVM이 있습니다.예를 들어 네트워킹과 같은 연결을 확립하지 않는 한 이들 사이에 어떠한 연결도 있어서는 안 됩니다.IDE 내에서 작업하는 경우 일반적으로 작성한 코드는 별도의 JVM에서 실행됩니다.IDE는 보통 디버깅을 위해 별도의 JVM을 연결합니다.복수의 Web 애플리케이션을 취급하고 있는 경우, 같은 Web 컨테이너에 도입하면, 같은 JVM을 공유할 수 있습니다.
이론적으로는 JVM에서 여러 애플리케이션을 실행할 수 있습니다.실제로, 그들은 다양한 방법으로 서로 간섭할 수 있다.예를 들어 다음과 같습니다.
- JVM에는 1세트가 있습니다.
System.in
/out
/err
디폴트 부호화 1개, 디폴트로케일 1개, 시스템 속성 세트 1개 등입니다.하나의 응용 프로그램이 이러한 내용을 변경하면 모든 응용 프로그램에 영향을 미칩니다.- 를 호출하는 모든 응용 프로그램
System.exit()
모든 애플리케이션을 삭제합니다.- 애플리케이션 스레드 중 하나가 와일드하게 되어 CPU 또는 메모리를 너무 많이 소비하면 다른 애플리케이션에도 영향을 줍니다.
간단한 답변: JVM당 하나의 애플리케이션을 사용할 수 있는 경우가 많습니다.긴 답변: JVM은 이러한 방식으로 사용할 수 있으며, 이것이 가장 좋은 옵션일 수 있지만 반드시 사용할 필요는 없습니다.
이 모든 것은, 「어플리케이션」이라고 생각되는 것에 의해서 다릅니다.IDE는 최종 사용자(즉, 당사)에게 단일 엔티티로 표시되지만 실제로는 여러 기본 애플리케이션(컴파일러, 테스트 실행자, 정적 분석 도구, 패키지 관리자, 프로젝트/의존 관리 도구 등)으로 구성된 애플리케이션의 좋은 예입니다.이 경우 IDE는 기본 툴의 개별적인 변덕으로부터 (어느 정도) 보호되면서 통합 경험을 사용자에게 제공하기 위해 다양한 방법을 사용합니다.이러한 방법 중 하나는 텍스트 파일 또는 애플리케이션 수준의 디버깅 기능을 통해 통신하면서 별도의 JVM에서 몇 가지 작업을 수행하는 것입니다.
애플리케이션 서버(Wildfly, Glassfish, Websphere, Weblogic 등)는 다른 애플리케이션을 실행하는 컨테이너 역할을 하는 애플리케이션입니다.이 경우 애플리케이션별로 1개의 JVM(즉, 애플리케이션 서버 전체의 실행에 1개의 JVM이 사용됨)이 존재하지만 실제로는 JVM에 여러 개의 애플리케이션이 포함되어 각각의 클래스로더에서 논리적으로 분리되어 있습니다(프로세스 크로스 크리스털에서 우발적으로 발생할 가능성을 줄입니다).k)
이 .application
되었을 때 실행되는 것"을말하는 JVM당 "main()"을 합니다. OS JVM의 JVM입니다.public static void main()
★★★★★★ 。
그러나 애플리케이션이 복잡해지기 시작하면 경계가 모호해집니다.Intelij나 Eclipse 등의 IDE는 같은 JVM 또는 다른 JVM에서 'javac'과 같은 기능을 많이 재사용할 뿐만 아니라 다른 작업(화면 재도장 등)도 수행합니다.또한 (공유 JVM) 애플리케이션 서버상의 웹 애플리케이션 사용자는 실제로 명령줄을 통해 로컬에서 사용할 수 있는 것과 거의 동일한 '핵심' 애플리케이션을 사용할 수 있습니다.
실행 중인 JVM 수는 호출된 실행 파일의 수입니다.이러한 각 애플리케이션은 자체 Java 실행 파일(java.exe/javaw)을 호출합니다.exe etx for windows)는 각각 다른 JVM에서 실행되고 있음을 의미합니다.
라이브러리를 공유하는 응용 프로그램은 해당 라이브러리의 동일한 복사본을 공유합니다.Java에는 상당한 양의 공유 라이브러리가 있습니다.다만, 보존되어 있는 메모리를 제외하고, 그 차이를 알 수 없습니다.
하지만 이 정보는 누군가에게 유용할 수도 있다.Linux 시스템에서 실행 중인 JVM의 수를 알고 싶다면 이 명령을 사용해 보십시오.
$ ps -ef | grep "[j]ava" | wc -l
ps
하려면 , 「」를 참조해 주세요.grep
검색하다, 검색하다, 검색하다, 검색하다, 검색하다, 검색하다, 검색하다, 검색하다, 검색하다, 검색하다, 검색하다, 검색하다, 검색하다, 검색하다, 검색하다, 검색하다, 검색하다, 검색하다, 검색하다, 검색하다, 검색하다.wc
를 세다
사실 이것은 매우 혼란스러운 답변을 가질 수 있는 질문입니다.간단히 말하면:
- Java 프로세스당, JVM당 있음.
- 런타임 및 ProcessBuilder는 이 규칙을 따릅니다.
- 리플렉션을 사용하여 jar를 로드하고 main을 실행해도 새로운 JVM이 생성되지 않습니다.
언급URL : https://stackoverflow.com/questions/5947207/is-there-one-jvm-per-java-application
'programing' 카테고리의 다른 글
OS X에서 NODE_ENV를 운영/개발로 설정하는 방법 (0) | 2022.11.01 |
---|---|
'SQLSTATE[22007]' 메시지와 함께 'PDOException' 예외 발생:잘못된 날짜/시간 형식: 1366 잘못된 문자열 값 (0) | 2022.11.01 |
JavaScript 문자열에서 HTML 태그를 삭제하는 방법 (0) | 2022.10.23 |
mysql 경고 해결 방법: "InnoDB: page_cleaner: 1000ms 의도 루프에 XXXms가 걸렸습니다.설정이 최적이 아닐 수 있습니다. (0) | 2022.10.23 |
SQL Syntax Error for 5.5.35-MariaDB (0) | 2022.10.23 |