자바 힙(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. 힙 메모리 동작 과정
- 객체 생성 → Eden 영역에 저장됨
- Eden 영역이 가득 차면 → Minor GC 실행
- 살아남은 객체는 Survivor 영역으로 이동
- 여러 번 살아남으면 Old 영역으로 이동
- 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 튜닝이 중요합니다.
'[AWS-FRF] > EC2' 카테고리의 다른 글
[참고] REST API 방식과 TCP 방식의 차이점!! (5) | 2025.03.25 |
---|---|
[중요] NGINX / JAVA 서버 로그 주기 설정 작업 !! (5) | 2025.03.12 |
[참고] Amazon EBS 암호화 작동 방식 !! (3) | 2025.03.11 |
[참고] AES-256(Advanced Encryption Standard - 256bit) 강력한 대칭키 암호화 알고리즘 !! (3) | 2025.03.11 |
[중요][AWS] Vault Consul 포트 이슈 !! (4) | 2025.03.05 |
[참고][장애회고] ORM(JPA) 사용 시 예상치 못한 쿼리로 인한 HikariCP 이슈 (3) | 2025.02.19 |
[중요] Amazon Linux 2023 Swap 메모리 설정하기!! (2) | 2025.02.17 |
[중요][AWS][Linux] systemctl 명령어로 서비스 등록, 생성, 삭제!! (18) | 2025.02.05 |
댓글