-
jvm 놓친 부분 알아보기TIL 2021. 2. 15. 20:54
jvm을 기본 적인 부분은 안다고 생각했었다.
오히려 이런 생각 때문에 깊이 있게 공부를 하지 않은 거 같다.
그래서 클래스 로더 부분에 대해 다시 공부해보자.
github.com/ChoiGiSung/JavaStudy/blob/main/1%EC%A3%BC%EC%B0%A8.md
백기선 님 study 1주 차에 공부했던 건데 클래스 로더 부분은 까먹어 버렸다.
내가 알고있는 기본 적인 동작을 먼저 서술해 보자.
개발자가 소스코드를 작성하면 자바 컴파일러는 소스코드 -> 자바 바이트코드로 변환을 시킨다.
java를 통해 .class 파일을 실행시키면 클래스 로더가. class 파일을 읽으면서 데이터들을 RuntimeDataAreas에 알맞게 적재를 한다. 정적 변수는 메소드 영역에 인스턴스 변수는 힙에 로컬 변수는 스택에 저장을 하고,
다 적재가 되면 익스큐션 엔진이 코드를 실행시킨다. 처음에는 인터 프린터 방식으로 읽어서 자바 바이트코드를 실행시킨다. 근데 사실 읽으면서 캐시에 저장시키고 있다가 전에 해석했던 문장이 또 나오면 캐시에 저장된 정보를 실행시킨다 (jit 컴파일러)
이렇게 알고 있었다.
이제 클래스 로더 부분을 좀 살펴보자.
1. 클래스 로더는 처음부터 클래스들을 전부 읽고 올리는 게 아닌 그 class가 사용될 때 동적으로 올리는 것이다.
2. 로딩 부분은 : 클래스 정보 (FQCN) 등을 메모리에 로딩한다.
부트스트랩 로더와 익스텐션 로더 부분은 java에 이미 있는 클래스 파일들을 로딩한다.
애플리케이션 로더는 개발자가 작성한 클래스들을 메모리에 올려놓는다.
3. 링킹 부분은 : 클래스 파일이 제약조건에 맞게 잘 작성되었는지 검사를 하고, 정적 변수를 기본값으로 저장한다.
int형 정적 변수는 0으로 저장을 한다는 거다.
4. 이니셜제이션 : 정적 변수를 초기값으로 저장한다. + static 블록을 실행한다.
런타임 데이터 에어리어
메서드 영역은 : 클래스 정보를 저장한다(클래스 이름, 클래스 간 관계) 정적 변수도 저장한다. 그 외 잡다한 것도 저장한다. ex) 바이트 코드
힙은 인스턴스 변수를 저장한다. enum도 힙에 저장된다고 한다.
스택은 지역변수들을 저장한다. 스택 영역은 각 스레드마다 생성이 된다.
pc레지스터는 예전엔 그냥 넘어갔는데 역할이 있었다. 바로 각 스레드가 어디까지 실행됐는지 저장하는 거다 프로그램 카운터인 거다. 스레드마다 정보가 있기에 스레드 수만큼 생성된다.
익스큐션 엔진
코드를 실행시키는 부분으로 인터프리터와 jit을 이용해 실행시킨다. gc가 안 쓰는 레퍼런스를 삭제한다.
'TIL' 카테고리의 다른 글
2021.02.17 기록장 (0) 2021.02.16 2021.02.16 기록장 (0) 2021.02.15 2021.02.15 기록장 (0) 2021.02.14 2021.02.14 기록장 (0) 2021.02.14 2021.02.13 기록장 (0) 2021.02.12