본문 바로가기

Programming/JAVA

java : JVM의 메모리 구조.

관련해서 한두번 글을 올린 적이 있는데 가장 기초의 JVM 메모리구조를 다시 작성해볼까 합니다.



그림에서 볼 수 있듯이 자바 가상 머신은(JVM)
클래스 영역, 자바 스택 영역, 힙 영역, 네이티브 메소드 스택 영역으로 구성되어있습니다. 

각 영역은 밑과 같은 공간으로 쓰입니다.

클래스 영역
실행에 필요한 클래스들을 로드하여 저장하는 공간으로서 로드된 클래스의
메소드들은 메소드 영역에, 상수들은 상수 영역에 저장이 됩니다.

자바 스택 영역
자바 프로그램을 수행하면서 발생하는 메소드 호출과 복귀에 대한 정보를 생성하여 저장하는 영역인데
Throwable 객체가 생성시에 이 영역에 대한 내용을 복사합니다.(exception 들의 가장 상위 클래스) 
JVM 수행도중에 발생되는 exception들의 printStackTrace 메소드 내용은 스택 영역의 내용들이라고
보시면 됩니다.

힙 영역
객체를 생성할 때 동적으로 공간을 할당하여 객체를 저장하는 공간입니다.
이 힙 영역에 대해서 얼마의 공간을 할당하느냐에 따라서 실제 서비스를 할 때에 서버에 얼만큼의 부하를 주거나
줄일 수 있느냐를 결정할 수 있습니다. 그 이유는 힙 영역의 메모리공간이 부족하게 되면 자동으로 가비지컬렉션이
수행되는데 이때 힙 영역 공간이 너무 크다면 그간 쌓여있던 모든 old 객체들을 지우는데에 부하가 크게 됩니다.
따라서, 힙 영역을 설정할 때에는 서비스 시뮬레이션이 잘 이루어져야합니다.(시뮬레이션이란 표현이 옳은가 모르겠네요;)
참, 힙영역에 넣어놓은 permanent 공간은 클래스들의 메타정보가 로드되는 공간입니다.
메타정보의 주 내용들은 보통 jsp와 같은 파일들이 클래스로 변환되기에 필요한 정보들을 뜻합니다.
(jsp 파일이 결국 java로 변환되니까....그쵸?;;;)
만약 이 permanent 공간이 부족하다면 로드 자체가 안되는 일을 겪게 됩니다...
(작년 겨울에 사양이 별로 좋지못한 컴퓨터로 작업하다가
 자주 이클립스가 아웃오브메모리를 뱉고 실행조차 안하는 걸 겪었는데, 그땐 왜그랬는지 몰랐드랬죠....)

네이티브 메소드 스택 영역
자바가 처음 공개되었을 때 약속되었던 것이 바로
"한번 작성하면 어느 곳에서든 사용한다 (Write Once, Use Anywhere)" 입니다.
자바가 운영체제에 종속적이지 않고 사용할 수 있는 것은 JVM 덕분입니다.
그런데 이를 가능케하기 위해서 하드웨어에 종속적이지 않게하려하였는데 그러다보니 하드웨어를 직접 제어하는 기능이
제공되지 않습니다. (OS가 제공하는 api나 하드웨어 드라이버 제어 등)
그래서..... 꼼수를 쓴 것이 JNI (Java Native Interface) 입니다.
(native code : 플랫폼 종속적인 코드)
네이티브 메소드 스택 영역은 java 어플리케이션에서 호출한
네이티브 메소드들이 바이트 코드로 변환되면서 사용되고 기록하는 영역입니다.