JVM 구조
java ·자바 애플리케이션을 프로파일링할때 필요한 배경지식이다
크게 클래스 로더 시스템(class loader system), 메모리(memory), 실행엔진(execution engine), JNI, 네이티브 메소드 라이브러리로 나뉜다.
클래스 로더 시스템
바이트 코드들을 읽어들여 메모리에 적절하게 배치한다.
주요 동작
로딩(loading)
.class 파일에서 바이트코드를 읽어온다
링크(linking)
레퍼런스를 연결한다.
초기화(initialization)
static 값들을 초기화한다
메모리(Memory)
크게 5가지 영역으로 나뉘어진다.
메소드(Method) 영역
클래스 수준(클래스 이름, 부모 클래스 이름, 메소드, 변수)의 정보를 저장한다.
공유하는 자원으로 다른 영역에서 참조가 가능하다
힙(Heap) 영역
객체를 저장한다. 공유하는 자원이다.
스택(Stack) 영역
쓰레드마다 런타임 스택이라는 것을 만들고, 그 안에 스택 프레임을 쌓는다. 스택 프레임은 메소드 호출시 생성된다
PC(Program Counter) registers
쓰레드마다 현재 실행할 스택 프레임을 가리키는 포인터
네이티브 메소드 스택(Native Method Stack)
쓰레드마다 생성되며 네이티브 메소드마다 생기는 별도의 스택이다
실행엔진(execution engine)
바이트 코드를 실행한다.
인터프리터(interpreter)
바이트 코드를 한줄 한줄 읽어서 실행한다.
한줄씩 읽어서 네이티브 코드를 바꿔서 실행한다.
매 한줄마다 컴파일을 진행한다.
JIT(Just In Time) 컴파일러
인터프리터에서 반복되는 코드들을 바이트 코드에서 네이티브 코드로 컴파일해준다.
인터프리터에서는 JIT에서 컴파일한 코드를 바로 사용한다.
GC(Garbage Collector)
참조를 하지 않는 객체를 힙 영역에서 정리해준다.
Minor GC, Major GC로 나뉘어진다.
Minor gc는 young generation를 정리하기 때문에 stop the world가 일어나지 않는다.
Major GC는 우리가 흔히 아는 stop the world를 만드는 GC다.
커스터마이징이 가능하다.
자바 네이티브 인터페이스(JNI)
자바 애플리케이션에서 C, C++, 어셈블리로 작성된 코드를 사용할 수 있는 방법
native 키워드를 사용한 메소드 호출
네이티브 메소드 라이브러리
C, C++로 작성된 라이브러리다.