본문 바로가기
개발자의 공부방/자바

JVM 메모리 구조

by 쥬니준 2021. 11. 15.
728x90
반응형

1. 개요

면접 보고 JVM 구조 질문이 있었다. 면접 끝나고 나서 갑자기 짜증이 났다. 아니 xx 이거 알아서 뭐 어쩌라는건데? 한글의 자음 모음의 첫 시작은 뭐고 그 구조는 언어학적으로 어떤지 모르면 한국어 못하는건가? 라는 이런 뜬금없는 생각이 났고 질문에 어버버 거리면서 머뭇거리는 상황이 떠올라서 갑자기 짜증이 확났다. 그래서 공부한다. 그리고 정리해본다.

 

2. 본론

자바 프로그램의 실행 단계

JAVA CODE (.java) ➡️ JAVAC Compiler ➡️ Byte Code (.class) ➡️ JVM ➡️ Windows or LINUX ➡️ Mac

 

그래서 자바코드를 갖고 개발할 때 JAVA를 다운받는 것이고 그 안에는 JDK(개발키트), JRE(런타임 환경)가 있는 것이다.

 

🎱  JRE는 JDK의 일부다.

참고 : https://www.redhat.com/ko/topics/cloud-native-apps/what-is-a-Java-runtime-environment

 

자바 런타임 환경(JRE, Java Runtime Environment)이란?

Java 런타임 환경(JRE)이란 Java 애플리케이션을 생성하고 실행하는 데 필요한 구성 요소이며 Java 개발 키트(Java Development Kit, JDK)의 일부를 뜻합니다.

www.redhat.com

 

 

출처 : https://www.guru99.com/java-virtual-machine-jvm.html

 

1. Class Loader

    ➡️ 클래스 로더는 클래스 파일을 로드하는데 사용되는 하위 시스템이다. 여기에는 세 가지 주요 기능을 수행한다.

  • 로드
  • 연결
  • 초기화

2. Method Area

    ➡️ 메타데이터, 상수 런타임 풀 및 메소드용 코드와 같은 클래스 구조를 저장한다.

 

3. Heap

    ➡️ 모든 Objects, 관련 인스턴스 변수 및 배열은 힙에 저장된다. 그리고 이 메모리는 공통이며, 여러 스레드에서 공유된다.

 

4. JVM Language Stacks

    ➡️ 자바의 언어 스택은 지역 변수를 저장한다. 각 스레드에는 스레드가 생성될 때 동시에 생성되는 자체 JVM 스택이 있다.

        메서드가 호출될 때 마다 새로운 프레임이 생성되고 메서드 호출 프로스세가 완료가 되면 삭제된다.

 

5. PC Registers

    ➡️ 현재 실행 중인 자바 가상 머신 명령어의 주소를 저장한다. JAVA에서 각 스레드에는 별도의 PC레지스터가 있다.

 

6. Native Method Interface

    ➡️ 네이티브 라이브러리에 따라 네이티브 코드의 명령을 보유한다. JAVA 대신 다른 언어로 작성되어 있다고 한다.

 

7. Execution Engine

    ➡️ 하드웨어, 소프트웨어 또는 전체 시스템을 테스트하는데 사용되는 소프트웨어 유형이다. 테스트 실행 엔진은 테스트된 제품에 대한 정보를 절대 전달하지 않는다.

 

8. Native Method Libraries

    ➡️ 실행엔진 (Execution Engine)에 필요한 Native Libraries(C, C++)의 모음이다.

 

9. Garbage Collector

    ➡️ 흔히 GC라고해서 불필요한 메모리를 정리해주는 것으로 많이 알고 있다. 조금 더 얘기해보자면 힙(heap) 내의 객체 중에서 가비지를 찾아내고, 처리해서 힙의 메모리를 회수하는 것이다. 가비지를 구별하는 것은 reachability 라는 개념을 사용하지만 이 부분의 설명은 아래 그림의 출처인 NAVER D2 Coding의 글에서 보는 것을 추천한다.

런타임 데이터 영역

출처 : https://d2.naver.com/helloworld/329631

3. 결론

일단 JVM 구조는 복잡한 구조이지만 각각의 영역을 보면 해당하는 기능과 수행을 한다.

또 한가지 안 사실은 자바는 원래 다른 언어에 비해 느린 언어로 분류됐었다고 한다.

이유는 

  1. 동적 연결
  2. 런타임 인터프리터

동적연결은 C와는 달리 java에서 실행될 때 마다 런타임이 수행되기 때문이고 런타임 인터프터는 바이트 코드를 Native 기계 코드로 변환하는 작업을 하게 되는데 이때 JAVA에서 런타임이 일어나므로 속도가 더욱 느려진다고 한다.

 

*바이트 코드를 네이티브 기계 코드로 변환하는 중 JIT가 생기는데 JIT 컴파일러는 Just-In-time를 의미하며, 시간에 맞춰서 코드를 컴파일하는 것을 말한다.

 

하지만 점차 발전됐기 때문에 자바의 성능은 업그레이드 되고 병목 현상 등이 많이 해결된거라고 한다. 

반응형

댓글2

  • 2021.11.19 16:34

    좋은글 보고갑니다.
    면접관이 좀 과하시네 ㅎㅎㅎ 신입분한테 이런걸 물어보다니.. ㅠㅠㅠㅠ

    힘내서 더 좋은데 가시길 응원합니다.
    답글

    • 쥬니준 2021.11.25 09:00 신고

      감사합니다...개발자라는 직업에 최소한의 소양이라 생각하고 공부하고 있습니다ㅠㅠ...제가 무지한거죠 뭐..