반응형
자바8 메모리 영역 변화
JVM의 여러 메모리 영역 중에 PermGen 메모리 영역이 없어지고 Metaspace 영역이 생겼다.
PermGen
- 메모리 구조
- 클래스 로딩 시, 클래스의 이름, 클래스에 담겨있는 스태틱한 필드 등의 정보를 담아 놓는 공간
- 클래스를 많이 사용할수록 이 영역에 데이터가 많이 쌓이게 된다.
- permanent generation, 클래스 메타데이터를 담는 곳.
- Heap 영역에 속함.
- 기본값으로 제한된 크기를 가지고 있음.
- 동적으로 클래스를 생성하는 경우 PermGen 영역이 가득 차는 경우가 발생할 수 있다. 메모리 에러 발생.
- 위의 문제를 근본적으로 해결하려면 PermGen 사이즈를 늘리는 것이아니라 클래스를 동적으로 생성하는 코드를 수정해야한다.
- -XX:PermSize=N, PermGen 초기 사이즈 설정
- -XX:MaxPermSize=N, PermGen 최대 사이즈 설정
Metaspace
- 메모리 구조
- 클래스 메타데이터를 담는 곳.
- Heap 영역이 아니라, Native 메모리 영역이다.
- 기본값으로 제한된 크기를 가지고 있지 않다.
- Native 메모리 영역이 가득찰 때까지 필요한 만큼 계속 늘어난다.
- Native 메모리 영역이 가득차게 되면 서버가 죽는 치명적인 문제가 발생할 수 있다.
- 따라서 최소한 Metaspace의 최대 사이즈는 설정해주어야한다.
- 효율적으로 사용하려면 모니터링 하여 최적의 Metaspace 값을 찾아 최대값으로 설정하는 것이다. 만약 모니터링으로 도출해낸 이 값에 메모리 문제가 생기면 어딘가의 메모리 누수를 의심해보아야 한다.
- 자바 8부터는 PermGen 관련 java 옵션은 무시한다.
- -XX:MetaspaceSize=N, Metaspace 초기 사이즈 설정.
- -XX:MaxMetaspaceSize=N, Metaspace 최대 사이즈 설정.
[참고자료]
PermGen Elimination project is promoting
[Java Memory Profiling에 대하여]① JVM 메모리 이해와 케이스 스터디
[Java Memory Profiling에 대하여]② 메모리 모니터링과 원인분석
반응형
'Java > 기본' 카테고리의 다른 글
이펙티브 자바(Effective Java) 아이템 1 - 생성자 대신 정적 팩터리 메서드를 고려하라 (0) | 2024.04.08 |
---|---|
자바(Java) - 제네릭에 대하여(Generics) (0) | 2022.03.04 |
자바 배열 정렬(Java Array Sort) - 정렬(Arrays.sort), 병렬 정렬(Arrays.parallelSort) 비교 (0) | 2021.07.05 |
자바 애노테이션(Java Annotation)의 변화 (0) | 2021.07.05 |
자바 동시성(Java Concurrent) - 4 (CompletableFuture) (0) | 2021.07.05 |