JVM은 자바 가상머신으로 자바 바이트코드를 실행 할 수 있는 주체로 JVM 덕분에 CPU나 운영체제(플랫폼)과 독릭접으로 동작 가능하다
JVM은 크게 Class Loader,GC, Runtime Data Area, Excute engine 세가지로 나뉜다
자바 컴파일러가 .java 파일을 컴파일하면 .class 파일(바이트 코드)가 생성된다. 이렇게 생성된 클래스 파일들을 엮어 Runtime Data Area 형태로 메모리에 적재하는 역할을 한다.
메모리에 적재된 클래스들을 기계어로 변경해 명령어 단위로 실행하는 역할을 한다.
명렁어를 하나 하나 실행하는 인터프리터 방식과 실행 시점에 자주 쓸만한 코드들을 기계어로 변환 시켜놓고 저장해서 사용하는 JIT 방식이 있다.
Heap 메모리 영영에 생성 된 객체들중에 Reachability를 잃은 객체를 탐색 후 제거하는 역할을 한다.
자세한 내용은 가비지 컬렉터(GC)에 대하여를 참고
Method Area
클래스 멤버 변수, 메소드 정보, Type(Class or interface)정보, Constant Pool, static, final 변수 등이 생성된다. 상수 풀은 모든 Symbolic Refernce를 포함하고 있다.
Heap Area
동적으로 생성된 오브젝트와 배열이 저장되는 곳으로 Garbage Collection의 대상이 되는 영역이다.
Stack Area
지역 변수, 파라미터 등이 생성되는 영역, 동적으로 객체를 생성하면 실제 객체는 Heap에 할당되고 해당 레퍼런스만 Stack에 저장된다. Stack은 스레드별로 독자적으로 가진다.
Heap에 있는 오브젝트가 Stack에서 참조 할 수 없는 경우 GC의 대상이 된다.
PC Register
현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있다.(CPU의 PC Register와 다르다)
자세한 내용은 링크 참조
Native Method Stack
자바외 언어로 작성된 네이티브 코드를 위한 메모리 영역
Reference
JIT : https://medium.com/@lazysoul/jit-just-in-time-16bb63f3ae26
JVM : https://jeong-pro.tistory.com/148
JVM, GC의 정확한 동작 방식이 궁금했는데 정리 너무 깔끔하네요 ㅎㅎ 잘 읽었습니다!
+) 그리고 PC Register 부분 설명 링크가 잘못 걸려있는거 같아요 ㅎㅎ