자바 어플리케이션 성능 측정을 하려다 보니, 자바에 대해 모르는 부분이 많아서, 다시 한번 자바의 기본 동작원리와 어떻게 도는지 개념을 마지막을 정리하겠다.
한 2년전에 아직 개발을 막 시작했을 때도 같은 내용을 보고 정리했는데, 지금은 그 때보다 훨씬.. 이해하는 정도가 늘어나있는거 같다.
요번에 마무리로 깔끔하게 정리해놓고, 또 정리가 필요하면 나중에 시간이 흐르고, 더 성장해있을 때 정리해보도록 하자..
백기선 님의 자바 온라인스터디 깃헙를 기반으로 자바 개념을 순차적으로 정리해나갈 생각입니다.
위의 그림을 보면
JVM은 크게 3가지 영역으로 생각할 수 있다.
JVM의 정의는 "자바 어플리케이션이 수행되는 런타임 엔진"이다.
그렇기 때문에, JVM에서 표현되는 모든 것들은 런타임시 실행된다고 이해하면 된다.
각 영역에서 어떤 영역이며, 어떤 작업들이 이루어지는지 정리해보도록 하자.
classLoader에 의해 컴파일된 class파일들로부터 데이터를 읽게 된다.
이 과정은 세가지 단계로 진행된다.
로딩 - 링크 - 초기화
로딩
링크
초기화
부트스트랩 : JAVA_HOME/lib에 있는 코어 자바 API를 제공. 최상위 우선순위를 가진 클래스로더
플랫폼 : JAVA_HOME/lib/ext 폴더 또는 java.ext.dirs 시스템 변수에 해당하는 위치에 있는 클래스를 읽는다.
어플리케이션: 앱 classPath에 있는 곳에 클래스를 읽는다.
메서드 영역 :
프로그램을 실행하는데 필요한 공통 데이터 관리. 이 영역은 프로그램의 모든 영역에서 공유한다.
클래스정보, static 영역, runtime 상수 풀
스택 영역 :
자바 실행시, 하나의 실행 스택이 생성된다. 각 스택 프레임은 지역변수, 중간 연산결과, 메소드 호출 정보들을 포함한다.
메소드가 종료되면 해당 스택 프렝미이 제거된다.
스택 영역은 쓰레드 별로 하나씩 생성된다.
힙 영역 :
개체와 배열이 생성되는 영역. GC가 이루어지는 주요 영역, 더이상 참조하지 않은 객체는 GC에 의해 제거된다.
클래스의 참조형 멤버변수는 각 인스턴스 값이 다르게 힙 영역에 존재하지만, 클래스의 메소드는 메소드 영역에 존재해서 공유하게 됩니다.
#cf) Heap 메모리의 old 영역에 메모리가 계속 쌓이게 되면, FULL GC가 발생하고, 모든 쓰레드들이 멈춰서 어플리케이션의 문제가 생길 수 있다.
PC Register 영역:
CPU가 instruction을 수행하는 동안 필요한 정보를 저장 ..(?)
Native Method Stakc:
Java 이외의 언어로 작성된 native코드를 위한 stack ..(?)
실행엔진은 3가지로 구성되있다.
마지막으로 전체적인 그림으로 컴파일 타임과 런타임에 어떤 작업들이 이루어지는 간단하게 보자
몇년전에는 이 그림이 무슨말인가.. 했는데.. 이제는 그래도 어떤 영역이고, 어떤작업들이 이루어지겠구나 대략적으로는 알겠다. 많이 성장하긴 했구나란 생각이 든다..
https://github.com/whiteship/live-study/issues/1
https://jeongjin984.github.io/posts/JVM/