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 |