클래스의 로딩과정과 JVM이 관리하는 메모리 영역

minsub park·2020년 8월 11일
1

JAVA basic

목록 보기
3/8

클래스 로딩 과정

$ java com.eomcs.oop.ex03.Exam0130
1) 클래스 파일 'Exam0130.class'을 찾는다.

  • JDK가 설치된 폴더의 하위 폴더인 /lib에서 찾는다.

  • OS의 CLASSPATH 환경 변수에 설정된 디렉토리를 탐색하여 찾는다.

  • JVM을 실행할 때 -classpath 또는 -cp 옵션으로 설정된 디렉토리를 탐색하여 찾는다.

  • JVM을 실행하는 현재 폴더에서 찾는다.

  • 그래도 없으면 오류를 띄운다.
    2) 바이트코드 검증(Verify)

  • 클래스의 바이트코드 유효성을 검사한다.
    3) Exam0130.class를 "Method Area 영역"에 로딩한다.

  • 즉 클래스를 외부 저장소(HDD)에서 내부 저장소(RAM)로 로딩한다.

  • bytecode를 분석하여 코드(생성자, 메서드)와 상수를 따로 보관한다.
    4) 스태틱 필드 및 메서드 테이블 준비(Prepare)

  • Method Area 에 스태틱 필드 생성한다.

  • 클래스 내부에서 사용하는 이름(변수명, 메서드명, 클래스명 등) 목록을 준비한다.
    5) 참조하는 외부 클래스나 인터페이스 검사(Resolve)

  • 다른 클래스나 인터페이스를 참조하는 것이 유효한지 검사한다.
    6) 클래스 초기화시키기

  • 변수 초기화 문장(variable initializers), 스태틱 블록(static initializers)을 실행한다.
    7) main() 메서드를 호출한다.

  • 클래스를 실행하는 것이라면 main() 메서드를 찾아 실행한다.

JVM이 관리하는 메모리 영역

1) Heap

  • new 명령으로 생성한 인스턴스가 놓인다.
  • 즉 인스턴스 필드가 이 영역에 생성된다.
  • 가비지 컬렉터는 이 메모리의 가비지들을 관리한다.
    2) JVM Stack
  • 각 스레드가 개인적으로 관리하는 메모리 영역이다.
  • 스레드에서 메서드를 호출할 때 메서드의 로컬 변수를 이 영역에 만든다.
  • 메서드가 호출될 때 그 메서드가 사용하는 로컬 변수를 프레임에 담아 만든다.
  • 메서드 호출이 끝나면 그 메서드가 소유한 프레임이 삭제된다.
    3) Method Area
  • JVM이 실행하는 바이트코드(.class 파일)를 두는 메모리 영역이다.
  • 즉 클래스 코드가 이 영역에 놓이는 것이다.
  • JVM은 코드를 실행할 때 이 영역에 놓은 명령어를 실행하는 것이다.
  • 주의! Heap에는 개발자가 작성한 명령어가 없다.
  • 개발자가 작성한 클래스, 메서드 등 이런 코드들이 이 영역에 놓이는 것이다.
  • 스태틱 필드를 이 영역에 생성한다.
profile
Hello World! 어제보다 나은 코드를 위해

0개의 댓글