이전에 JVM 과 COMPLIER 에 대해 전반적으로 공부하였다.
다시 요약정리 해보자
Class Loader
JVM 내로 클래스 파일을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈이다. 런타임 시에 동적으로 클래스를 로드한다.
Execution Engine
클래스 로더를 통해 JVM 내의 Runtime Data Area 에 배치된 바이트 코드들을 명령어 단위로 읽어서 실행한다. 초기의 JVM 에서는 인터프리터 방식이여서, 속도가 느렸지만, JIT COMPLIER 방식을 통해 이 점을 보완하였다. 모든 코드를 JIT 를 통해 네이티브 코드를 바꿔서 실행하지 않고, 인터프리터 방식을 사용하다가, 일정한 기준이 넘어가면 JIT 컴파일러 방식으로 실행한다.
Garabage Collector
GC는 힙 메모리 영역에 생성된 객체들 중 참조되지 않은 객체들을 탐색 후 제거한다. GC가 역할을 하는 시간은 정확히 알 수 없다.
Runtime Data Area
오늘 중점적으로 공부해볼 영역이다.
JVM 의 메모리 영역으로 자바 어플리케이션 실행할 때 사용되는 데이터들을 적재하는 영역이다. 이 영역은 아래와 사진같이 나뉜다.
JVM의 메모리 영역 (Runtime Data Area)를 조금 더 자세히 공부해보려 한다.
-모든 쓰레드가 공유하는 메모리 영역으로, 클래스,인터페이스, 메소드 필드 ,static 변수 등의 바이트 코드를 보관한다.
-모든 쓰레드가 공유하며, 객체와 배열이 생성되는 영역이다. 메소드 영역의 로드된 클래스만 생성이 가능하고 Garbage Collector가 참조 되지 않는 메모리를 확인하고 제거하는 영역
-메소드 호출 시마다 각각의 스택 프레임(해당 메소드만을 위한 공간)을 생성한다. 메소드 안의 사용되는 값들을 저장하고, 호출된 메소드의 매개변수,지역변수 , 리턴 값 및 연산 시 일어나는 값들을 임시로 저장하고, 마지막으로 수행이 끝나면 스택 프레임 별로 삭제한다.
쓰레드가 시작될 때, 생성되며, 생성될 때마다 생성되는 공간으로 쓰레드마다 하나씩 존재. 쓰레드가 어떤 부분을 무슨 명령으로 실행해야할 지에 대한 기록을 하는 부분으로 현재 수행중인 JVM 명령의 주소를 갖는다.
자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역. (..?)
c/c++ 등의 코드를 수행하기 위한 스택
*cf) 정리된 사진이다
읽어보면서 이해해자.
JVM 메모리 관련 읽어볼만한 내용 읽어보고 정리하자!
https://m.post.naver.com/viewer/postView.nhn?volumeNo=23726161&memberNo=36733075
https://steady-coding.tistory.com/305
https://limkydev.tistory.com/51