Java

JVM 이란?

joje* 2024. 11. 30. 20:13

1. JVM(Java Virtual Machine)이란?
인간이 해석할 수 있는 텍스트 형태로 작성된 java 코드를 이용해 소스코드를 실행 시 다음과 같은 과정을 거쳐 해당 코드가 실행되게 된다.
java 코드는 컴파일러에 의해 바이트 형태의 코드로 변경되고, 변경된 코드는 ClassLoader에 의해 JVM에 올라가게 된다. JVM 은 바이트 코드로 된 코드를 해석하면서 실행하고, JIT(Just-In-Time) 컴파일러를 사용해 실행 중에 최적화된 네이티브 코드로 변환시킨다.
JVM 에 올라간 코드는 일종의 프로세스가 되어  JVM의 각각의 영역에서 메모리에 할당된 후 CPU에 의해 처리되면서 코드가 실행되며 필요한 작업을 시행하게 된다. 
 JVM은 os 위에서 실행되므로  java는 다른 프로그램밍 언어와 달리 os 에 종속되지 않는다는 특징을 지니게 된다. 

JVM의 구조는 이미지와 같이 구성되어 있고 각각의 역할은 다음과 같다.

이미지 출처: https://velog.io/@guswlsapdlf/Java%EC%9D%98-JVM-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0

 

  • ClassLoader: .java 파일을 이용해 코드를 실행시키면 이는 바이트 코드 형태로 변환이 되고, ClassLoader는 이렇게 변환된 코드를 JVM에 적재하는 역할을 한다.
  • GarbageCollector: RuntimeDataArea에서 이용되지 않는 불필요한 자원을 제거해 메모리 누수를 막아주는 역할을 한다.
  • RuntimeDataArea: MethodArea, Heap, Stack, PC Register, NativeMethodStack 영역으로 구성되어 있으면 코드 실행 시 사용되는 데이터들을 적재하는 역할을 한다.

- 데이터를 적재하는 RuntimeDataArea 영역은 아래와 같이 구성되어 각각을 나누어 적재한다.

이미지 출처: https://velog.io/@guswlsapdlf/Java%EC%9D%98-JVM-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0

 

  • MethodArea: 바이트 코드로 된 클래스 정보들이 저장되는 공간
  • Stack: 지역변수, 매개변수, 리턴값등과 같은 메소드 처리가 끝나면 동시에 사라질 변수들이 저장되는 공간
  • PC Register: 쓰레드의 실행 위치 같은 쓰레드 관련 정보가 저장되는 공간
  • NativeMethodStack: java 이외의 언어로 작성된 코드에 관한 정보가 저장될 공간
  • Heap: new 키워드로 생성된 인스턴스 저장되는 공간. Heap 영역은 Eden, old, permanent 영역으로 구분되며 각각의 영역을 구분하는 기준은 아래와 같다. 
이미지 출처: https://meritis.fr/blog/introduction-au-concept-de-garbage-collector%E2%80%AF
  • Young(New) Generation: new 키워드를 통해 새로운 인스턴스가 생성되면 Eden영역에 저장되고, 이후 Servivor로 이동하게 된다. 시간이 지나며 이 영역에 있는 데이터는 우선순위에 따라 Old영역으로 이동하거나 GC에 의해 회수되며 이를 Minor GC라 한다.
  • Tenured(Old) Generation: Young Generation 영역에 저장되어 있던 객체 중 오래된 인스턴스가 이동되어 저장되는 영역을 의미한다. Old 영역에 할당된 메모리가 허용치를 넘게 되면, Old 영역에 있는 모든 인스턴스들을 검사해 참조되지 않는 인스턴스를 한꺼번에 삭제하며 이를 Major GC라 한다. Major GC 발생 시 Major GC를 실행하는 쓰레드를 제외한 모든 쓰레드가 작업을 중지하며 이를 Stop-the-World라 한다. 
  • Permanent Generation: ClassLoader에 의해 동적으로 로딩된 클래스의 메타데이터가 저장되는 영역을 의미한다.

2. 프로세스의 메모리 구조와 JVM의 메모리 구성 비교
- 프로세스 메모리는 운영 체제에서 프로그램을 실행하기 위한 메모리 관리 방식으로, 코드, 데이터, 힙, 스택 등으로 나누어진다.
- JVM 메모리는 Java 애플리케이션을 실행하기 위한 메모리 관리 구조로, 메소드 영역, 힙, 스택, 네이티브 메모리 등을 포함하며, Java 프로그램에 맞게 최적화된 메모리 영역을 제공한다.
 
 
- 참고한 사이트
https://velog.io/@guswlsapdlf/Java%EC%9D%98-JVM-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0

Java의 JVM 메모리 구조

우리가 흔히 code editor에서 작성하는 Java 언어는 컴퓨터가 이해할 수 없는 형태이다. 따라서 이를 컴퓨터가 이해할 수 있는 기계어로 변환을 시켜줘야 한다. 이때, 컴퓨터가 이해할 수 있는 기계

velog.io

https://medium.com/java-for-beginners/understanding-java-virtual-machine-jvm-architecture-e68d1c611026

Understanding Java Virtual Machine (JVM) Architecture

Most Java developers and students who study software engineering don’t understand what is the importance of learning basic concepts in…

medium.com

https://velog.io/@impala/JAVA-JVM-Runtime-Data-Area

[JAVA] JVM - Runtime Data Area

JVM의 메모리영역인 Runtime Data Area에 대해 알아보고 각 영역별 특징과 역할을 이해한다

velog.io

 
 

'Java' 카테고리의 다른 글

[톰캣에서 JVM 힙 메모리 크기 조절하기]  (0) 2023.08.28
[JDK, JRE, JVM]  (0) 2023.08.28
[웹 개발]java 소스코드 실행과정  (0) 2022.08.30