ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] JVM
    Programming/Java 2020. 9. 16. 03:11

    JVM(Java Virtual Machine)

    일반적인 프로그램은 OS가 프로그램을 실행시킨다. 반면 Java로 쓰여진 프로그램은 OS가 JVM을 실행시키면 JVM이 Byte Code로 컴파일된 java 프로그램을 실행시킨다.

     

    즉, Java 클래스 파일은 OS 위에서 직접 동작하는 것이 아니라 JVM 위에서 동작한다.

    윈도우, 리눅스, 맥 등 각각의 OS를 위한 JVM만 설치되어 있다면 어떤 OS라도 Java 프로그램을 실행할 수 있다.

    이는 가장 잘 알려져있는 Java 언어의 장점인 플랫폼 독립성에 관한 것이다.

     

    그러나 Java 프로그램은 일반 프로그램보다 한 단계를 더 거쳐야 하므로 상대적으로 실행 속도가 느리다는 단점이 있다.

     

     

    JVM 구성 요소

    Class Loader

    클래스 로더는 실행할 클래스 파일의 위치를 찾아 JVM으로 로딩하고 클래스 파일의 내부 구조를 분석한다.

    크게 어떤 메서드가 있는지, 선언된 변수를 분석하여 JVM의 적합한 런타임 데이터 영역에 데이터를 배치한다.

    Java는 동적으로 클래스를 읽어오므로, 런타임에 그 클래스가 참조되는 순간에 동적으로 JVM에 링크된다. 이러한 동적인 클래스 로딩은 클래스 로더 시스템을 통해 이루어진다.

     

    1. 클래스 파일 JVM으로 로드

    2. 메모리 영역에 데이터 배치

    Runtime Data Areas

    컴파일된 클래스파일을 JVM에서 실행하기 위해 OS로 부터 할당 받은 메모리 영역

    클래스 로더에서 분석된 클래스 파일의 데이터를 저장하고 실행 도중에 필요한 데이터를 저장한다.

    메모리의 효율적 관리를 위해 5개 영역(static, heap, stack, pc register, native method stack)으로 구분하며 간단히 메모리 영역이라고 부흔다.

    Execution Engine

    런타임 데이터 영역에 배치된 바이트 코드를 해석하며 실행한다. 이때, 인터프리터 방식과 JIT 컴파일 방식을 혼합하여 해석한다.

     

    1. 인터프리터 방식

    바이트 코드를 중간 코드로 변환한 후 Run time 시점에 Row 단위로 실행한다.

     

    2. JIT(Just-In-Time) 컴파일 방식

    인터프리터가 더 빨리 해석할 수 있도록 도와주는 역할

    인터프리터의 성능 향상 목적으로 도입, 자주 쓰이는 코드를 기계어로 변환하여 캐싱하고 있다가 재사용할 때 이미 변환된 기계어 코드를 재사용하는 것

     

    Garbage Collector

    메모리 관리 기능을 자동으로 수행한다. 더 이상 사용되지 않는 객체를 해제시켜 메모리를 자동으로 반납한다.

     

     

     

    Java 메모리 영역

    Method(static, class)

    데이터가 가장 먼저 저장되는 공간으로 클래스 로더에 의해 로딩된 클래스와 클래스에 대한 메타 정보(메서드, static 변수), 전역 변수가 저장된다.

    JVM이 클래스를 실행하면 메서드 영역에서 클래스 정보를 복사하여 힙 영역에서 메모리를 할당하여 실행한다.

    static 변수나 전역 변수를 무분별하게 많이 사용하면 메모리가 부족할 수 있다.

     

    모든 스레드 공유

    프로그램의 시작부터 종료까지 메모리에 남는다. 명시적인 Null 선언시 GC의 청소 대상이 된다.

     

    Heap 영역 

    참조형 데이터타입이 저장되는 공간, new 연산자를 통해 생성된 객체가 저장되는 공간이다.

    동적으로 객체가 생성되고 소멸되는 곳이며 3개의 영역(Youngm Old, Permnent)으로 구분된다.

     

    모든 스레드 공유

    객체가 더이상 쓰이지 않거나 명시적인 Null 선언시 GC의 청소 대상이 된다.

     

    * 참조형 데이터타입 : 값이 저장되어있는 곳의 주소값을 저장하는 공간, 런타임시 결정

     

    Stack 영역

    기본형 데이터타입이 저장되는 공간,지역변수, 매개변수, 리턴 값, 참조변수 등이 저장된다.

    메서드가 호출될 때, 메모리에 FILO로 하나씩 들어간다.

    메서드가 끝나면 메모리에 LIFO로 하나씩 제거된다.

    메서드 마다 각각의 스택 프레임(메서드 공간)이 생성된다.

     

    스레드 별 생성, 메서드가 호출 ~ 끝날 때 까지 보존된다.

     

    * 기본형 데이터타입 : 실제 값을 저장하는 공간, 컴파일시 결정

    PC 레지스터

    현재 수행중인 JVM 명령어의 주소 저장

     

    스레드 별 생성

    네이티브 메서드 스택

    바이트 코드가 아닌 기계어로 작성된 코드를 실행하는 공간으로 다른 언어(c/c++)로 작성된 코드를 수행하기 위한 공간이다.

    Java Native Interface를 통해 바이트 코드로 변환된다.

     

    스레드 별 생성, Java Native Interface 호출 및 종료시 생성

     

    메모리 영역 with 소스코드

    참고 자료

    futurists.tistory.com/40?category=550970

    gbsb.tistory.com/2?category=735872

    stophyun.tistory.com/37

    'Programming > Java' 카테고리의 다른 글

    [Java] Java 환경변수(JAVA_HOME &CLASSPATH)  (0) 2020.09.16
    [Java] JDK & JRE & JVM  (0) 2020.09.16
    [Java] Java 컴파일 & 실행 과정  (0) 2020.09.16
    [Java] Compile time vs Run time  (0) 2020.09.15
    [Java] 객체타입 Set  (0) 2020.09.10

    댓글

Designed by Tistory.