자바의 메모리 영역

엄지찬·2023년 3월 30일

자바의 메모리 영역


이번에는 자바(JAVA)를 사용할 때 알아야 할 메모리 구조 및 특징에 대해 알아보자!!

자바 프로그램을 실행하면 JVM(자바 가상 머신)은 OS로부터 메모리를 할당 받고, 그 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.

📌JVM이란??

  • Java Virtual Machine의 약자로 자바 가상 머신을 뜻한다.
  • Java는 OS에 종속적이지 않다는 특징이 있다. Java를 실행되기 위해서는 OS위에서 Java를 실행시켜줄 무언가가 필요하다. 그게 바로 JVM이다.

즉, 자바를 실행시켜주는 기능을 해주는 가상 기계이다.
이번 포스팅은 메모리 영역의 구조와 역할에 대해 알아보고 JVM은 나중에 따로 다뤄보도록 하자.


📂 메모리 영역

자바의 메모리 영역은 크게 3가지 영역으로 분류된다.
Method 영역, Stack 영역, Heap 영역
각각의 역할이 주어져 있으며 자세히 알아보자.


잠깐!🤚
메모리 영역을 알기 전에 자바에서 선언 위치에 따른 변수의 종류를 먼저 알아보도록 하자.

자바 변수의 종류

변수는 크게 네 종류로 변수의 선언된 위치에 따라 클래스변수, 인스턴스변수, 지역변수, 매개변수로 나뉜다.

public class Main {
	public static voide main(String[] args) { // 매개 변수
    	int num = 999; // 지역 변수
    }
}

public classs Counter {
	private int state = 0 ; // 인스턴스 변수
    
    public static int gage = 100; // 클래스 변수
    
    public int get(){
    	return state;
    }
}
변수명선언위치설명
클래스 변수
(class variable)
클래스 영역- 클래스 영역에서 타입 앞에 static이 붙는 변수
- 객체를 공유하는 변수로 여러 객체에서 공통으로 사용하고 싶을 때 정의
인스턴스 변수
(instance variable)
클래스 영역- 클래스 영역에서 static이 아닌 변수
- 개별적인 저장 공간으로 객체/인스턴스마다 다른 값 저장 가능
지역변수
(local variable)
메서드 영역- 메서드 내에서 선언되고 메서드 수행이 끝나면 소멸되는 변수
-초기값을 지정한 후 사용할 수 있다.
매개 변수
(parameter)
메서드 영역- 메서드 호출 시 '전달하는 값'을 가지고 있는 인수

각 변수의 생성시기는 이렇다.

  • 클래스 변수 : 클래스가 메모리에 올라갈 때
  • 인스턴스 변수 : 인스턴스가 생성되었을 때
  • 지역 변수 / 매개 변수 : 위치하고 있는 메서드가 수행되었을 때

Method 영역

  • static 변수, 전역 변수, 코드에서 사용되는 클래스 정보가 올라가는 영역이다.
  • 코드에서 사용되는 클래스를 클래스 로더가 읽고 클래스 별로 분류해서 저장한다.
  • JVM이 동작해서 클래스가 로딩될 때 생성된다.
  • Method 영역에 있는 것은 어느 곳에서나 접근이 가능하다.
  • 프로그램의 시작부터 종료가 될 때까지 메모리에 남아있다. 그러나 데이터를 무분별하게 많이 사용할 경우 메모리 부족 현상이 일어날 수 있다.

Stack 영역

  • 메서드 내에서 정의하는 기본 자료형에 해당되는 지역변수의 데잍 값이 저장되는 영역이다.
  • 지역 변수, 매개 변수 데이터 값이 저장된다.
  • Stack영역은 LIFO(Last-In-First-Out)의 특성을 가지며, 스코프(Scope)의 범위를 벗어나면 스택 메모리에서 사라진다.

Heap 영역

  • 런타임 시 동적으로 할당된 객체가 저장되는 영역이다.
  • 참조형 데이터 타입을 갖는 객체(인스턴스), 배열, new 연산자가 선언된 변수 등이 저장되는 공간이다.
  • Heap 영역은 Stack 영역과 다르게 보관되는 메모리가 호출이 끝나더라도 삭제되지 않고 유지된다. 그러나 사용이 되지 않는 메모리는 GC(가비지 컬렉터)에 의해 삭제된다.

이처럼 자바의 메모리 공간은 클래스, 변수 등 다양한 모습으로 저장이 되며 각 공간에서 역할에 맞게 움직인다.

특히, 내가 좀 더 봐야할 부분은 힙 영역에 대한 개념인 것 같다. 스택 영역과의 차이와 GC에 의한 메모리 관리 등 메모리 영역에 관한 개념을 좀 더 채우면 더욱 효율적으로 사용할 수 있을 것 같다.

profile
비전공 신입 개발자의 마라톤 완주!

0개의 댓글