1. 클래스 로더 시스템

  • 컴파일 되어있는 클래스 파일 같은것들을 읽어서 메모리에 적절하게 배치시킴
  • 로딩 , 링크 , 초기화 순으로 진행된다.

A. 로딩

  • 3가지 종류가 계층형으로 존재함.

  • (최상위 계층) Bootstrap 클래스로더 , 네이티브로 구현됨

  • 플랫폼 클래스로더

  • 애플리케이션 클래스로더

  • 애플리케이션 클래스로더에서 class 파일을 읽으라는 요청을 받을시 최상위부터 읽을 수 있는지 체크하고

  • 읽을 수 있으면 작동 모두 못읽으면 ClassNotFoundException 에러남.

  • 클래스 로더가 .class 파일을 읽고 그 내용에 따라 적절한 바이너리 데이터를 만들고

  • 메소드 영역에 저장

  • 메소드 영역에 저장하는 데이터는

  • FQCN ( 패키지 경로까지 포함한 클래스 이름)

  • 클래스 , 인터페이스 , ENUM

  • 메소드 , 변수

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

B. 링크

  • 레퍼런스를 연결

  • 링크는 3가지로 나뉨 Verify , Perpare , Resolve (optional)

  • Verfiy 는 .class파일의 형식이 유효한지 체크한다.

  • Perpare 는 클래스 변수 (static 변수) 와 기본값에 필요한 메모리를 준비해두는 과정

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

C. 초기화

  • Class의 Static 한 값들을 초기화 시킴
  • B.링크에서 Prepare 단계에서 준비시켜둔 메모리에 Class의 Static 변수 와 블럭을 할당함

2. 메모리

  • 스택 , PC , 네이티브 메소드 스택 , 힙 , 메소드 영역으로 나뉘어져 있음

A. 스택

  • 각 쓰레드 마다 런타임 스택을 만들고 그 안에 메소드 호출을 스택 프레임(메소드 콜)이라 부르는 블럭으로 쌓는다.

  • 에러 메세지에 콜 스택들을 보면 메세지 호출 스택을 볼수 있다.

  • 쓰레드 종료시 런타임 스택도 사라진다.

B. Program Counter Registers

  • 스택에서 각 쓰레드마다 런타임 스택을 만들고 메소드 호출을 스택 프레임에 쌓을때
  • 쓰레드에서 현재 실행할 스택 프레임을 가리키는 포인터가 생성된다.

C. 네이티브 메소드 스택

  • 쓰레드 마다 생성

  • 네이티브 메소드를 호출 할 때 네이티브 메소드의 매개변수 지역변수 등을 저장

  • 네이티브 메소드 라이브러리를 사용하려면 네이티브 메소드 인터페이스를 통해야 함

  • JNI를 사용하는 스택은 네이티브 메소드 스택에 저장됨

  • JNI는 java native interface 로 native 키워드가 붙어있으며

  • java로 구현된게 아닌 C나 C++로 구현된것.

D. 힙

  • 객체(인스턴스들)를 저장하고 공유하는 영역
  • Young Generation , Old Generation , Permanent Generation 이 존재

E. 메소드 영역

  • 클래스 수준의 정보 ( 클래스 의 이름 , 부모 클래스의 이름 , 메소드 , 변수 ) 가 저장되고 공유하는 영역

3. 실행 엔진

  • Byte 코드들을 한줄씩 읽어들여서 머신이 이해할수 있는 native 코드로 바꿔줌.
  • 머신이 이해하면서 실행함.
  • 한줄마다 byte code를 native code로 컴파일

A. 인터프리터

  • 바이트 코드를 한줄씩 읽어들임

B. Jit Compiler

  • Just In Time Compiler

  • 인터프리터가 읽어들이면서 반복 되는 코드를 발견하면

  • jit 컴파일러가 반복되는 코드를 모두 네이티브 코드로 바꿔둔다.

  • 그다음부터는 인터프리터는 네이티브 코드로 컴파일된 코드를 바로 사용한다.

  • 인터프리터 효율이 높아짐.

C. Garbage Collector

  • 더이상 참조되지 않는 객체를 모아서 정리한다.
  • Throughput collector 과 stop the world collect가 있다.
  • 우리는 서버 운영중 수많은 객체를 생성하고 response time이 중요하므로
  • 이런 경우는 stop the world 를 사용.

 

 

 

 

참고

Java 코드를 조작하는 다양한 방법 - 백기선

'개발 > java' 카테고리의 다른 글

공변 불변 반공변  (0) 2021.04.26
TDD 와 리팩토링  (0) 2020.09.07
enum 사용시 주의할점  (0) 2020.05.13
멤버변수의 초기화 시기와 순서  (0) 2020.04.15

+ Recent posts