공부/Java

[공부/자바] JVM 메모리 관리

오잎 클로버 2022. 3. 1. 09:32
728x90

Java 메모리 영역 중 Stack, Heap, 그리고 static 이렇게 3가지 영역에 대해 공부하고 기억, 그리고 기록을 남기고자 

포스팅하고 있습니다.

Static Area

자바 코드 내에 있는 3가지 영역(필드, 생성자, 메소드) 중 필드 부분에서 선언된 변수(전역변수)와 정적변수(static변수)를

static 영역에 데이터를 저장합니다. static 영역의 데이터는 프로그램의 시작부터 종료가 될 때까지 메모리에 남게 됩니다. 따라서 전역변수를 무분별하게 많이 사용할 경우, 메모리가 부족할 우려가 존재합니다. 

Stack Area

메소드 내에서 정의하는 기본 자료형(이하 타입) [int, double, boolean, byte 등)에 해당되는 지역변수의 데이터 값이 저장되는 영역으로, 해당 메소드가 호출될 때 메모리가 할당되고, 종료되면 메모리가 해제됩니다.

Stack 영역은 LIFO(Last In First Out)의 구조를 갖고 변수에 새로운 데이터가 할당되면 이전 데이터는 지워지는 특징이 있습니다.

for문에서 사용된 변수를 for문 밖에 사용할 수 없는 이유는 지역변수이기에 for문이 종료됨과 함께 Stack영역에서 해제되었기 때문입니다.

Heap Area

참조형의 데이터 타입을 갖는 객체(인스턴스), 배열 등은 Heap 영역에 데이터가 저장됩니다.

이때 변수(객체, 객체변수, 참조변수)는 Stack 영역의 공간에서 실제 데이터가 저장된 Heap 영역의 참조값을 

new 연산자를 통해 리턴받습니다.

-> 실제 데이터를 갖고 있는 Heap 영역의 참조값을 Stack 영역의 객체를 갖고 있음. 리턴받은 참조값을 갖고있는 객체를 통해서만 해당 인스턴스를 핸들함

 

참고로 Heap에 저장된 데이터가 더 이상 사용이 불필요하다면 메모리 관리를 위해 JVM에 의해 알아서 해제됩니다.

이러한 기능을 GC라고 하는 데, 이는 추후 자세히 다루도록 하겠습니다.

 

 

이상입니다.