자바의 메모리 영역

Daehwan Jung·2023년 2월 25일
0

Java 메모리 영역

Java를 사용하는 입장에서 알아야 할 메모리 구조 및 특징에 대해서 알아보려고 한다.

Java 프로그램이 실행되면 JVM에서 OS로부터 메모리를 할당받고 그 메모리를 용도에 따라서 여러 영역으로 나누어 관리를 한다.

JVM의 메모리 공간은 크게 Method(static)영역, Stack 영역 Heap 영역으로 구분되고 데이터 타입(자료형)에 따라 각 영역에 나눠서 할당 되게 된다.

Java 변수의 종류

클래스 변수

  • 클래스 영역에서 static이 붙는 변수
  • 객체를 공유하는 변수로 여러 객체에서 공통으로 사용하고 싶을 때 정의

인스턴스 변수

  • 클래스 영역에서 static이 아닌 변수
    개별적인 저장 공간으로 객체/인스턴스마다 다른 값 저장 가능
  • 객체/인스턴스 생성만 하고 참조 변수가 없는 경우 가비지 컬렉터에 의해 자동 제거됨

지역 변수

  • 메서드 내에서 선언되고 메서드 수행이 끝나면 소멸되는 변수
  • 초깃값을 지정한 후 사용할 수 있음

매개 변수

  • 메서드 호출 시 '전달하는 값'을 가지고 있는 인수
    public PostResponse addPost(String title,String body,String userName) {  //매개변수

	int num = 100; //지역변수
	...

        return postResponse;
    }
public class UserJoinResponse {
    private Long userId;  //인스턴스 변수
    private String userName;
    public  Static int test = 100; // 클래스 변수
}

Method(Static)영역

  • JVM이 동작해서 클래스가 로딩될 때 생성.
  • JVM이 읽어들인 클래스와 인터페이스 대한 런타임 상수 풀, 멤버 변수(필드), 클래스 변수(Static 변수), 상수(final), 생성자(constructor)와 메소드(method) 등을 저장하는 공간.
  • Method(Static) 영역에 있는 것은 어느곳에서나 접근 가능
  • Method(Static) 영역의 데이터는 프로그램의 시작부터 종료가 될 때까지 메모리에 남아있다.
  • tatic 메모리에 있는 데이터들은 프로그램이 종료될 때까지 어디서든 사용이 가능하다.
  • 그러나 static 데이터를 무분별하게 많이 사용할 경우 메모리 부족 현상이 일어날수 있게 된다.

Stack영역

  • 메소드 내에서 정의하는 기본 자료형에 해당되는 지역변수의 데이터 값이 저장되는 공간
  • 메소드가 호출될때 스택 영역에 스택 프레임이 생기고 그안에 메소드를 호출
  • primitive 타입의 데이터(int, double, byte, long, boolean 등) 에 해당되는 지역변수, 매개 변수 데이터 값이 저장
  • 메소드가 호출 될 때 메모리에 할당되고 종료되면 메모리에서 사라짐
  • Stack 은 후입선출 LIFO(Last-In-First-Out) 의 특성을 가지며, 스코프(Scope) 의 범위를 벗어나면 스택 메모리에서 사라진다.

Heap영역

  • JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당하여 사용하는 영역
  • 참조형(Reference Type) 데이터 타입을 갖는 객체(인스턴스), 배열 등이 저장 되는 공간
  • Heap 영역에 있는 오브젝트들을 가리키는 레퍼런스 변수는 stack에 적재
  • Heap 영역은 Stack 영역과 다르게 보관되는 메모리가 호출이 끝나더라도 삭제되지 않고 유지된다.
  • 어떤 참조 변수도 Heap 영역에 있는 인스턴스를 참조하지 않게 된다면, GC(가비지 컬렉터)에 의해 메모리에서 청소된다.
  • stack은 스레드 갯수마다 각각 생성되지만, heap은 몇개의 스레드가 존재하든 상관없이 단 하나의 heap 영역만 존재

참고

그림으로-보는-자바-코드의-메모리-영역스택-힙

0개의 댓글