본문 바로가기
[AWS-FRF]/EC2

[중요] 자바 힙(Heap) 메모리 구조 & 동작과정 / Heap 메모리와 Non-Heap 메모리 차이점 !!

by METAVERSE STORY 2025. 4. 2.
반응형

 

 

 

자바 힙(Heap) 메모리란?

자바 힙(Heap) 메모리는 **JVM(Java Virtual Machine)**이 애플리케이션을 실행할 때 사용하는 동적 메모리 공간으로, 객체와 배열이 저장되는 영역입니다.
힙 메모리는 JVM이 자동으로 관리하며, 필요하지 않은 객체는 **가비지 컬렉터(Garbage Collector, GC)**가 제거합니다.


1. 힙 메모리 구조

자바 힙 메모리는 일반적으로 세 부분으로 나뉩니다.

Young Generation (젊은 세대)

  • 새롭게 생성된 객체가 저장되는 영역
  • Young Generation은 다시 Eden, Survivor 0, Survivor 1로 나뉨
    • Eden 영역: 객체가 최초로 생성되는 공간
    • Survivor 영역(S0, S1): Eden에서 살아남은 객체들이 이동하는 공간
  • 대부분의 객체는 Young Generation에서 생성된 후, 금방 소멸됨
  • **GC: Minor GC(마이너 가비지 컬렉션)**이 주기적으로 실행됨

Old Generation (Old, 노년 세대)

  • Young Generation에서 오래 살아남은 객체가 이동하는 공간
  • 큰 객체나 장기적으로 유지되는 객체가 저장됨
  • GC: Major GC(마이너 GC보다 느림) 실행 시 전체 힙을 검사

Metaspace (메타스페이스, 이전: Permanent Generation)

  • 클래스 메타데이터(클래스 정보, 메서드, static 변수 등)가 저장됨
  • JDK 8부터 **PermGen(Permanent Generation)**이 제거되고, Metaspace로 변경됨
  • 기본적으로 OS에서 필요한 만큼 동적으로 확장됨

2. 힙 메모리 동작 과정

  1. 객체 생성 → Eden 영역에 저장됨
  2. Eden 영역이 가득 차면 → Minor GC 실행
    • 살아남은 객체는 Survivor 영역으로 이동
    • 여러 번 살아남으면 Old 영역으로 이동
  3. Old 영역이 가득 차면 → Major GC 실행
    • 오래된 객체가 제거되며, 성능 저하가 발생할 수 있음

3. 힙 메모리 관련 JVM 옵션

JVM의 힙 메모리 크기는 옵션을 통해 설정 가능합니다.

  • -Xms<size>: 초기 힙 메모리 크기 설정 (예: -Xms512m)
  • -Xmx<size>: 최대 힙 메모리 크기 설정 (예: -Xmx2g)
  • -XX:NewRatio=<ratio>: Young Generation과 Old Generation 비율 조정
  • -XX:SurvivorRatio=<ratio>: Eden과 Survivor 비율 조정
  • -XX:+UseG1GC: G1(Garbage First) GC 사용

 

## vi /etc/systemd/system/  서비스 내용 수정

-Xms256m -Xmx1024m 등록

 

 


4. 힙 메모리 문제 & 최적화

(1) 메모리 누수 (Memory Leak)

  • 사용되지 않는 객체가 GC에 의해 제거되지 않는 경우
  • static 변수, 미처 닫지 않은 리소스 등이 원인이 될 수 있음

(2) OutOfMemoryError (OOM)

  • 힙 메모리가 부족할 때 발생 (java.lang.OutOfMemoryError: Java heap space)
  • 해결 방법:
    • 힙 크기 조정 (-Xmx 증가)
    • 객체 수명 관리 (캐시 정리, 불필요한 객체 제거)
    • GC 튜닝 (-XX:+UseG1GC 등 활용)

5. 정리

  • 힙 메모리는 JVM이 객체를 저장하고 관리하는 공간
  • Young Generation(객체 생성), Old Generation(장기 객체 저장), Metaspace(클래스 메타데이터)로 나뉨
  • 가비지 컬렉션을 통해 자동 정리되지만, 튜닝이 필요할 수도 있음
  • 메모리 누수 & OOM 방지를 위해 효율적인 객체 관리를 해야 함

 

 

=========================================================

 

Heap 메모리와 Non-Heap 메모리는 주로 **JVM (Java Virtual Machine)**의 메모리 구조를 설명할 때 사용되는 개념입니다.
이 둘의 차이점은 용도, 메모리 관리 방식, 그리고 수명에 따라 나뉩니다.

 


1. Heap 메모리 (힙 메모리)

1) 정의:
Heap 메모리는 JVM이 동적으로 생성하는 객체와 인스턴스 변수를 저장하는 영역입니다.
자바 프로그램 실행 시 런타임에 메모리가 할당되며, new 키워드를 사용해 생성한 객체들이 이곳에 저장됩니다.

2) 특징:

  • GC(Garbage Collection)의 대상: 사용하지 않는 객체는 GC에 의해 자동으로 회수됨.
  • 크기가 상대적으로 큼: 프로그램 실행 중 늘어나거나 줄어들 수 있음.
  • 프로그램 전역에서 접근 가능: 모든 스레드가 접근할 수 있는 공유 메모리 영역.
  • 객체 생성 시마다 메모리 할당 및 해제 과정이 비교적 느릴 수 있음.

3) 세부 구분 (HotSpot JVM 기준):

  • Young Generation (젊은 영역):
    • 새롭게 생성된 객체들이 저장됨.
    • 빠르게 생성되고 사라지는 객체들을 관리.
    • Eden과 Survivor(S0, S1) 영역으로 나뉨.
  • Old Generation (노년 영역):
    • Young Generation에서 오래 생존한 객체가 이동됨.
    • 비교적 수명이 긴 객체들을 저장.
    • GC 수행 시 속도가 느림 (Full GC 발생).
  • Permanent Generation (PermGen, JDK 7 이하) / Metaspace (JDK 8 이상):
    • 클래스 메타데이터, 메서드, 리플렉션 정보 저장.
    • JDK 8부터는 Metaspace로 변경되어 Heap 외부에 위치.

2. Non-Heap 메모리 (논힙 메모리)

1) 정의:
Heap 영역 외에 JVM의 자체적인 메모리 관리 영역입니다.
클래스 메타데이터, 상수, 스태틱 변수, JIT 컴파일된 코드 등을 저장합니다.

2) 특징:

  • GC 관리 대상이 아님: 일반적으로 JVM 자체에 의해 관리됨.
  • 클래스와 메서드의 메타데이터 관리:
    • 클래스 구조, 메서드, 필드 정보, 상수 풀(Constant Pool) 등을 저장.
  • 동적 확장 제한적: JVM 시작 시 설정한 크기만큼 사용 가능.

3) 세부 구분:

  • Method Area:
    • 모든 클래스의 구조, 메서드, 인터페이스, 필드, 상수 등을 저장.
    • JDK 8 이전에서는 PermGen, JDK 8 이후에는 Metaspace로 변경됨.
  • Code Cache:
    • JIT (Just-In-Time) 컴파일러에 의해 최적화된 네이티브 코드 보관.
    • 빠른 성능을 위해 자주 사용되는 코드 캐싱.

3. Heap vs Non-Heap 비교 요약

구분Heap 메모리Non-Heap 메모리

용도 객체, 인스턴스 저장 클래스 메타데이터, JIT 코드, 상수, 스태틱 변수
GC 대상 여부 ✅ GC 대상 ❌ GC 대상 아님 (JVM 관리)
크기 상대적으로 큼, 동적 조정 가능 JVM 시작 시 크기 고정 또는 제한적 조정
성능 비교적 느림 (GC 영향) 빠름 (캐시 역할)
주요 영역 Young Gen, Old Gen, Metaspace Method Area, Code Cache

4. 정리

  • Heap 메모리는 애플리케이션 실행 중 동적으로 생성되는 객체의 메모리를 관리하며, GC가 주기적으로 정리합니다.
  • Non-Heap 메모리는 JVM 자체에서 사용하는 메모리로, 클래스 메타데이터, JIT 코드, 상수 등을 관리합니다.
  • Heap 메모리의 효율적 관리가 JVM 성능에 큰 영향을 미치므로, Java 개발 시 메모리 관리와 GC 튜닝이 중요합니다.

 

 

반응형

댓글