JVM 동작방식 세부 정리
이 글을 포스팅하기에 앞서, 제가 공부하고 퍼온 사진의 내용과 저작권은 https://coding-factory.tistory.com/828 이 블로그에 있다는 것을 미리 말씀드리겠습니다. 또한 저 개인의 공부용이기에 원저작자분의 글이나 저의 글을 상업적으로 이용하지 않았으며, 해서도 안됨을 미리 밝히겠습니다. 혹시라도 문제가 될 시 바로 삭제조치 하겠습니다.
새로 알게 된 점
우선 저 위에 사진과 내용을 정리하자면
1.자바에서 프로그램(예를들어 이클립스 같은 통합개발 툴을 통해 JAVA 언어로 작성한 나의 코드. 소스코드) 을 실행하면 JVM은 운영체제로부터 메모리를 할당하며, 그 뒤 자바 컴파일러가 소스코드 .java를 바이트코드 .class로 컴파일 해줍니다.
2.그런 코드를 클래스 로더를 통해 런타임 환경(JVM이 운영체제로 부터 할당받은 메모리 영역)으로 로딩시키고, 실행엔진을 통해 해석해줍니다.
(더 세분화 하자면, 클래스 로더로부터 로딩된 바이트 코드를 우선 메소드 영역으로 배치시키고 나서 실행엔진이 바이트 코드를 해석 실행시켜줍니다.)
3.해석된 코드를 런타임 환경의 각 영역에 배치시키며, 이때 실행엔진을 통해 가비지 컬렉터(GC)의 작동과 스레드 동기화가 이루어집니다.
다음으로 알게 된 점
메모리 영역을 기준에 따라 분류하자면 다음과 같습니다.
스레드를 공유하는 영역: 힙 영역, 메소드 영역
스레드를 공유하지 않는 영역: 스택영역, PC 레지스터, 네이티브 메소드 스택
1. 메소드 영역: "클래스 멤버 변수의 이름, 데이터 타입, 접근 제어자 정보와 같은 각종 필드 정보들과 메서드 정보, 데이터 Type 정보, Constant Pool, static변수, final class 등이 생성되는 영역입니다." 라고 합니다
2. 힙 영역: new 연산자를 통해 생성된 객체와 배열이 위치하는 공간이며, 주기적으로 GC가 제거하는 영역이라 합니다.
3. 스택 영역: "지역변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값 등이 생성되는 영역입니다." 라고 합니다.
추가적으로 객체를 가리키는 참조 변수, 그리고 기본타입의 변수와 그 값들도 저장된다고 합니다.
4. PC 레지스터: "Thread가 생성될 때마다 생성되는 영역으로 프로그램 카운터, 즉 현재 스레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역입니다."라고 합니다.
5.네이티브 메소드 스택: "자바 이외의 언어(C, C++, 어셈블리 등)로 작성된 네이티브 코드를 실행할 때 사용되는 메모리 영역으로 일반적인 C 스택을 사용합니다. 그리고 보통 C/C++ 등의 코드를 수행하기 위한 스택을 말하며 (JNI) 자바 컴파일러에 의해 변환된 자바 바이트 코드를 읽고 해석하는 역할을 하는 것이 자바 인터프리터(interpreter)입니다.
(솔직히 맨 아래 내용은 이해가 잘 안가네요;;)
우선 시간이 너무 늦은 관계로 막판에는 복붙을 막 했는데, 되도록이면 머리에 더 잘 남도록 타이핑 해야겠습니다.