본문 바로가기
프로그래밍/Java

[Java] JVM 메모리 구조

by Lim-Ky 2017. 6. 28.
반응형

오늘은 자바 JVM의 메모리에 대해서 알아보도록 하겠다.

 

사실 JVM 메모리에 대해서 왜 알아야할까? 스스로 자문했을 때 메모리 관리정도?라고 답변을 했다.

 

소규모프로젝트나 간단한프로그램을 만드는 개발자들은 JVM메모리에 대해서 빠삭하게 이해해야할 필요성을 느끼지 않을 수 있다.

(나도 그랬으니까...)

 

뭐 그럴 수 있다쳐도 대규모의 프로젝트를 개발해야 할 때 적어도 Java로 개발한다면, JVM메모리 구조에 대한 이해는

필수적이며 기본적으로 알아야 할 개념인 것이다.

 

메모리관리에 따라 프로그램의 성능은 월등히 차이가 날 수 있으며,

메모리관리를 제대로 하지 못해 성능저하 현상이 일어나는 경우는 보통 33%가 코드를 잘 못짰거나, 메모리에 대한 이해없이

설계를 한 경우다. 생각이상으로 더 중요한게 메모리개념인 것이다.

 

또 어디서 자바개발자라고 명함을 내밀려면 꼭 알아둬야 한다...

 

 

 

 

우선 JVM이란?

 

자바 가상 머신이라 부른다.

자바와 운영체제사이에서 중계자 역할을 한다.

자바가 운영체제 종류에 영향받지 않고 돌아갈 수 있도록 한다.

메모리 관리를 자동으로 해준다 (GC)

 

여기서 중요한 것은 운영체제와 플랫폼 종류에 의존적이지 않고 독립적으로 JAVA프로그램이 실행된다.

 

 

 

 

 

위 그림을 설명하면...

 

Java Compiler(자바 컴파일러)에 의해 Java source(.java) 파일은  Byte code로 변환된다.

 

Class Loader(클래스 로더)는 이 변환된 Byte code(.class) 파일을 JVM 내로 class를 로드하고 Link작업을 통해 

배치 등 일련의 작업을 한다. 또 런타임시 class를 load한다.

 

Execution Engine(실행 엔진) 은 Class Loader를 통해 JVM 내부로 넘어와 Runtime Data Area(JVM 메모리)에 배치된 

Byte code들을 명령어 단위로 실행시킨다.

 

GC(Garbage Collector)는 어플리케이션이 생성한 객체의 생존 여부를 판단하여, 더이상 참조되지 않거나 null 인 객체의 메모리를 해체시켜

메모리 반납을 한다. 

 

Runtime Data Areas(JVM 메모리) 런타임 데이터 영역은 JVM메모리로 Java 어플리케이션이 실행하면서 할당받은 메모리영역이다.

 

세분화하자면 6개(Method, Runtime Constant Pool, Heap, Stack, PC Register, Native Method Stack)의 영역으로 나뉜다.

 

 

 

출처 : http://hoonmaro.tistory.com/19

 

 

6개 메모리 영역의 용도와 특징

 

(화질이 좋지 않으니 클릭해서 보시길.)

 

 

끝으로 Heap Area를 좀 더 살펴보면....

 

Young Generation : 객체가 생성될 때 저장된다. 즉 막 생성된 객체들의 인큐베이터이다. 생성된 기간이 흐르고, 우선순위가 낮아지면

                          Young 세대의 객체들은 Old세대로 이동하게 된다. 이 영역에서 객체가 사라질 때는 Minor GC 수행된다.

 

Old(Tenured) Generation : Young Generation 영역에 있는 객체가 오래되서 저장되는 공간이다.

                                   이 영역에서 객체가 사라질 때는 Major GC(Full GC) 수행된다.

 

Permanent Generation :  클래스 로더에 의해 로든되는 클래스, 메소드 등에 대한 메타 정보가 저장되는 영역으로 JVM에 의해 사용된다.                                  리플렉션을 사용하여 동적으로 클래스가 로딩되는 경우에 사용된다. 

 

 

또 Method와 Runtime Constant Pool , Heap 영역은 모든 스레드에서 공유할 수 있다.

 

 

반응형

'프로그래밍 > Java' 카테고리의 다른 글

[Java] multi thread 구현 02  (0) 2017.07.02
[Java] multi thread 구현 01  (1) 2017.06.29
[Java] enum 이란?  (3) 2017.06.27
[Java] 멀티스레드 개념  (1) 2017.06.27
[Java] HashTable, Hashmap, ConCurrentHashMap 차이  (0) 2017.06.18

댓글3