반응형
오늘은 Java 8 버전에서 등장한 MetaSpace에 대해 알아보자.
Permanent Generation
자바 7버전까지는 Permanent Generation이라는 영역이 존재했다.
줄여서 PermGen라고 부른다.
- PermGen은 로드되는 클래스, 메서드 등에 관한 정보 등 메타 데이터(리플렉션)를 저장한다.
- 모든 static 메서드, static 변수를 저장한다.
- Java 7 버전까지는 String Pool도 PermGen의 일부
- 바이트 코드, 이름, JIT 정보도 가지고 있다.
- 이 영역은 제한된 메모리가 큰 단점이다.
- 제한 된 메모리로 인해 Out Of Memory(OOM) 문제가 발생할 수 있다.
Permanent Generation은 Heap 영역인가?
위 사진만보면 PermGen은 Heap 영역 내부에 포함되는 것처럼 보인다.
자료를 찾아보면 많은 자료들이 PermGen을 Heap 영역 내부에 존재하는 것처럼 말한다.
자료를 찾아보니 PermGen은 오라클 기준 Method Area라고 불렸다.
JVM을 공부해보면 Method Area는 Heap과 같이 모든 스레드가 공유하는 영역이지만 엄밀히 말하면 Heap과는 다른 영역이다.
PermGen은 정말로 Heap 영역에 포함되는 것일까??
정확히 말하면 PermGen은 Heap 영역은 아니다.
오라클 공식문서에서는 PermGen을 설명하면서 non-heap이라고 적어놓았다.
더불어 힙 공간이 부족해지면 발생하는 에러와 PermGen이 부족해져서 발생하는 오류가 다르다.
java.lang.OutOfMemoryError: Heap space space
java.lang.OutOfMemoryError: PermGen space
MetaSpace
자바 8부터는 MetaSpace가 PermGen을 대체했다.
- 로드되는 클래스, 메서드 등에 관한 메타 데이터(리플렉션) 저장
- 힙이 아닌 Native 메모리 영역 사용
- PermGen이 사라지면서 static 변수, String pool은 Heap 영역에 저장한다.
- Native 영역의 크기는 운영체제가 동적으로 다룬다. 즉 자동 확장이 가능
- MetaSpace가 Native 영역을 사용하면서 OOM의 대한 부담이 줄어들었다.
참고 자료
https://stackoverflow.com/questions/41358895/permgen-is-part-of-heap-or-not
https://www.linkedin.com/pulse/permgen-vs-metaspace-mohammed-elnwam/
반응형
댓글