Java 의 저장공간 Heap

SUUUI·2025년 3월 28일

java

목록 보기
3/16

앞에 포스팅에선 JVM 에 대해 설명하는 글이 있었다.
jvm 은 java 가 어디서든 실행될 수 있게 해주는
가상머신이다 .

Java 코드는 특정 플랫폼에 맞게 컴파일되는 것이 아니라, JVM이라는 중간 계층을 통해 실행되기 때문에 플랫폼 독립적으로 동작할 수 있는 것이다 .

그렇다면 프로그램의 저장 메모리 공간도 따로 있지 않을까?
그 저장 공간이 바로 JVM 에 속해 있는 heap 이라고 하는 저장공간이다 .

정확히 말하자면 JVM(Java Virtual Machine)이 관리하는 메모리 공간인 것이다.

▶️오늘은 JVM 의 메모리 공간이자 어플리케이션의 성능을 결정짓는 heap 에 대해 공부해보자

JVM과 메모리 구조

▶️JVM(Java Virtual Machine):
Java 바이트코드를 실행하는 가상 머신으로, 다양한 운영체제에서 동일한 Java 코드 실행 가능

▶️JVM 메모리 영역:

Heap: 객체 인스턴스가 저장되는 공간
Stack: 메소드 호출, 지역 변수 저장
Method Area: 클래스 구조, 메타데이터 저장
PC Register: 스레드 실행 위치 정보
Native Method Stack: 네이티브 코드 실행 공간

Heap 메모리의 구조

▶️Young Generatio

Eden Space: 새로 생성된 객체가 처음 할당되는 공간
Survivor Spaces(S0, S1): Minor GC 후 살아남은 객체가 이동하는 공간

▶️Old Generation

여러 GC 사이클을 거쳐 오래 살아남은 객체들이 이동하는 영역
String Pool, 오래 참조되는 객체, 큰 컬렉션 등이 저장

‼️가비지 컬렉션(Garbage Collection)

목적: 더 이상 참조되지 않는 객체를 자동으로 메모리에서 해제
종류:

Minor GC: Young Generation에서 발생, 짧은 시간 내에 자주 실행
Major GC(Full GC): Old Generation 포함, 전체 힙에서 실행, 시간이 더 오래 걸림

힙에 저장되는 객체 예시

▶️Eden Space:

메소드 내에서 생성되는 임시 객체들
List numbers = new ArrayList<>();
지역 변수에 할당된 객체

▶️Survivor Space:

여러 Minor GC를 거친 후에도 여전히 참조 중인 객체
메소드 호출 간에 전달되는 객체

▶️Old Generation:

Spring Bean: 애플리케이션 전체에서 공유되는 서비스 객체
String Pool: 문자열 리터럴("안녕하세요")
Enum 상수: PaymentType.CREDIT_CARD
정적 필드: static final Map<String, User> CACHE = new HashMap<>();
오래 유지되는 컬렉션: 애플리케이션 상태를 오래 유지하는 리스트/맵

▶️중요 개념 정리

참조와 객체: 참조 변수는 스택에, 실제 객체는 힙에 저장
GC와 살아남은 객체: 가비지 컬렉션은 더 이상 참조되지 않는 객체만 수거
메모리 누수: Java에서도 객체를 계속 참조하면 메모리 누수 발생 가능
String Pool: 문자열 리터럴을 재사용하는 특별한 메모리 영역
Spring Bean: Spring 프레임워크가 관리하는 객체로, 일반적으로 싱글톤 패턴으로 관리되며 애플리케이션 전체에서 공유됨

profile
간단한 개발 기록

0개의 댓글