[Java 개발] Java의 메모리

Java입문강좌

시작하며

여러분 안녕하세요!

DreamHanks의 254cm입니다.

이번 시간에는 지금까지 java 기사에서 잠깐 언급되었지만

다루지 않았던 메모리에 대해 간략하게 다루려고 합니다.

Java의 전체 기사는 여기를 클릭해 주세요.

 

JVM

메모리에 대해 말하기 전에 JVM이라는 것을 알아야 합니다.

JVM는 Java Virtual Machine의 약자이고 Java 프로그램을 실제로 실행하는 것입니다.

JVM은 CPU나 운영체제와 관계 없이 Java 프로그램을 실행할 수 있습니다.

그 JVM안에는 Class Loader, Execution Engine, Garbage Collector, Runtime Data Area 등으로

구성되어 있는데, 이번에는 ‘Garbage Collector’, ‘Runtime Data Area’만을 다룰 겁니다.

 

Garbage Collector

Garbage Collector는 JVM의 메모리 관리를 담당하는 것입니다.

Garbage Collector는 객체 안에서 더 이상 쓰지 않는 객체의 메모리를 제거하는 것입니다.

 

Runtime Data Area

Runtime Data Area는 Java 프로그램이 실행할 때 실제 데이터가 저장되는 공간입니다.

이 공간은 크게 Method영역, Heap영역, Stack영역, PCResister영역, Native Method Stack영역으로 나누어져 있습니다.

이번에는 Method, Heap, Stack 영역만 다룰 겁니다.

 

Method 영역

Method영역은 클래스 정보가 모아져 있습니다.

클래스의 필드 변수의 이름, 데이터형, 접근 제어자 정보와 같은 필드 정보,

메서드의 이름, 반환값의 데이터형, 인수, 접근 제어자와 같은 메서드 정보,

static 변수, final class 변수 등이 저장되어 있는 영역입니다.

여기서 static 변수는 JVM이 자바 프로그램을 실행할 때 메모리를 할당할 수 있고

프로그램이 종료될 때 메모리가 해제됩니다.

그래서 static 변수는 프로그램이 실행되는 동안 생성되어 있는 그대로 유지되기 때문에 어디서나    사용할 수 있습니다.

 

Heap영역

Heap 영역도 자세히 설명하면 몇 개의 영역으로 나뉘는데, 이번에는 무시합니다.

Heap 영역은 new로 생성된 객체와 배열 데이터가 저장되는 영역입니다.

샘플

클래스의 필드의 정보는 Method 영역에 격납되어 있습니다.

new에서 클래스의 컨스트럭터를 호출하면 인스턴스가 생성되고, Heap 영역에 저장됩니다.

그 때, 각 Instance의 필드에 메모리가 할당되어 값을 대입하거나 할 수 있게 됩니다.

그리고 Human 클래스의 변수 “human”은 그 인스턴스의 주소를 저장합니다.

Stack영역                                                                   Heap영역

Heap 영역에서 Garbage Collector 역할

Garbage Collector는 아무도 참조하지 않는 메모리 공간을 대상으로 삭제합니다.

샘플

위의 샘플을 보면 human이 가리키고 있는 메모리의 주소를 null로 하고 있습니다.

그리고 human에 새로운 인스턴스를 생성해 참조시키고 있습니다.

즉, 첫 번째 할당된 인스턴스는 아무도 참조하지 않습니다.

그러한 메모리 공간(첫 번째 instance)이 Garbage Collection의 대상이 됩니다.

※Garbage Collection은 Garbage Collector가 아무도 참조하지 않는 메모리를 지우는 동작을       의미합니다.                                                                                         

 

Stack 영역

로컬 변수, 인수, 반환값과 같은 데이터가 저장되는 영역입니다.

Stack 영역에는 기본형 변수는 변수와 그 데이터가 같이 저장되는데

참조형(오브젝트)은 인스턴스 주소만 저장하고 실제 데이터는 Heap 영역에 저장됩니다.

Stack영역은 메서드를 호출할 때마다 개인적으로 생성됩니다.

샘플

위의 경우를 순서대로 설명하면 (args는 무시합니다.)

① main 메서드의 Stack 영역이 생성됩니다.

image.png

 

② age가 생성되며 10으로 초기화됩니다.

image.png

 

③ multiply 메서드가 실행되고 Stack 영역이 생성됩니다.

image.png

 

④ multiply 인수가 생성되며 넘겨받은 값으로 초기화됩니다.

image.png

 

⑤ value가 생성되며 연산의 결과가 대입됩니다.

image.png

 

⑥ return이 실행되고 mutiply 실행이 종료됩니다. 그리고 multiply에서 사용된 변수는 Stack에서   삭제됩니다.

image.png

 

⑦ multiply 메서드 실행결과가 age에 대입됩니다.

image.png

⑧ main메서드가 종료되고 main메서드에서 사용되었던 변수들이 삭제됩니다.

 

끝으로

이번 기사는 이상입니다.

방문해 주셔서 감사합니다.

 

コメント