육감적 코딩

[Java] JVM구조와 클래스 로더 시스템 본문

정리/Java

[Java] JVM구조와 클래스 로더 시스템

감감감감감감 2020. 7. 15. 22:01

JVM

자바 가상 머신으로 자바 바이트 코드를 OS에 특화된 코드로 변환

바이트 코드를 실행하는 표준이자 구현체

JVM 구조 

 

클래스로더 시스템

클래스 로더 시스템은 크게 세 가지로 볼 수 있습니다.

  • 로딩 : 실제 클래스 파일에서 바이트 코드를 읽어오는 과정

  • 링크 : 레퍼런스를 연결한다

  • 초기화 : static 값들을 초기화 및 변수에 할당

메모리

  • 스택 : 스택 영역에는 쓰레드 마다 런타임 스택을 만들고, 그 안에 메소드 호출을 스택프레임이라 부르는 블럭으로 쌓는다. 쓰레드를 종료하면 런타임 스택도 사라진다. (에러 발생 시 런타임 스택내역이 주르륵 뜨는 걸 볼 수 있습니다.)

  • PC 레지스터 : 쓰레드 마다 쓰레드의 현재 실행할 스택 프레임을 가리키는 포인터가 생성됩니다. 

  • 힙 : 객체를 저장. 공유자원입니다. (런타임 시 유동적으로 객체생성 할 때)

  • 메소드 : 메소드 영역에는 클래스 수준의 정보 저장. 공유 자원입니다.

 

Q. 그럼 메소드안에서 생성한 로컬 인스턴스는 힙영역? 스택영역?
= 힙영역의 값을 스택영역이 참조하는 식. 즉, 힙영역에 메모리가 올라감.

 

클래스 로더 시스템

클래스 로더

로딩, 링크, 초기화 순으로 진행된다.

  • 로딩

    • 클래스 로더가 .class 파일을 읽고 그 내용에 따라 적절한 바이너리 데이터를 만들고 ‘메소드’ 영역에 저장.

    • 로딩이 끝나면 해당 클래스 타입의 Class 객체를 생성하여”힙” 영역에 저장.

  • 링크

    • Verify : .class파일 형식이 유효한지 체크한다

    • Preparation : 클래스 변수 (static 변수)와 기본값에 필요한 메모리

    • Resolve : 심볼릭 메모리 레퍼런스를 메소드 영역에 있는 실제 레퍼런스로 교체한다.

  • 초기화

    • Static 변수의 값을 할당한다. (static 블럭이 있다면 이때 실행)

 

Comments