본문 바로가기

컴퓨터/JAVA

자바 고급 스터디 3. java JVM구조

반응형

자바 고급 스터디 목록

공부 시간 : 2021/03/25 22:30 ~ 25:25

3주차. JVM구조에 대해서 설명, 자바 버전에 따라 어떻게 바뀌는가?

jvm의 탄생배경

  • c, c++ 와 같은 언어들은 타겟 플렛폼(운영체제 + cpu아키텍쳐)에 종속적으로 작동함. ex) 리눅스에서 컴파일하면 윈도우에서 실행불가능
  • 자바 컴파일러에 의해 변환된 java 바이트코드(.class)는 타겟플렛폼에 의존하지 않고 JVM 위에서 작동된다.
  • JVM은 타겟플렛폼에 의존함. (window용 JVM, mac용 JVM...)

jvm 구조

1. class loader :

  • 자바는 어플리케이션 시작시 한번에 로드되지 않고, 필요할때 마다 로드된다. (lazy loading)
  • 런타임시에 클래스를 동적으로 jvm에 로드하는 역할을 한다.
  • 여러가지 클래스로더가 있으며 차례대로 로딩되며 작동된다.
  1. 부트스트랩 클래스로더(Bootstrap classloader)
    • jvm 시작시 가장 먼저 실행되는 클래스로더이다.
    • 최소한의 자바 클래스(java.lang.Object, Class, Classloader)만 로드한다.
    • 확장 클래스로더를 로드함.
  2. 확장 클래스로더(Extension classloader)
    • ${JAVA_HOME}/lib/ext, java.ext.dirs 시스템 프로퍼티에 적힌 라이브러리 로드
    • 애플리케이션 클래스로더를 로드함.
  3. 애플리케이션 클래스로더(Application classloader)
    • classpath 환경 변수, -classpath 또는 -cp 커맨드 라인 옵션에 나열된 라이브러리 파일을 로드
  4. 이외에도 커스텀 클래스로더를 만들어서 사용 할 수 있다.

2. 메모리 영역

  1. Heap 메모리
    • 객체의 인스턴스, 동적 할당된 데이터 저장
    • Garbage Collection이 일어나는 공간
    • java 1.8 이전과 이후로 Heap 영역의 구조가 변경됨.
    • 1.8 이전에는 perm영역 이 있었으나 (1.8이후 perm -> Heap + MetaSpace로 바뀜)
    • 1.8 이후 static은 heap또는 MetaSpace에 저장
  2. Thread Stack
    • 쓰레드마다 하나씩 배정되는 영역
    • 메소드 결과, return 값, 지역변수 저장
  3. MetaSpace
    • 클래스 메타데이터, 메서드 메타데이터, static 변수
  4. Code Cache
    • 자주 접근하는 코드블럭을 매번 컴파일 하지 않도록 컴파일된 기계어 캐싱되는 영역
    • Runtime Engine이 사용하는 영역
  5. Shared Library
    • 공유될 라이브러리가 기계어로 변환되어 저장되는 영역

3. Runtime Engine

  • Interpreter : 바이트코드를 읽어 기계어로 변환하여 실행
  • (JIT) Just-In-Time Compiler : Code Cache 메모리에 캐싱
  • Garbage Collection : 참조되지 않은 개체 정리

4. JNI(Java Native Interface)

  • Native Method Library를 실행하는데 필요한 인터페이스

5. Native Method Library

  • Execution Engine을 실행할때 필요한 라이브러리(C, C++) 모음.

 

 

참고한 사이트

반응형