JAVA 8에서 perm 영역이 사라지고 metaspace 영역으로 대체된 이유?

박진형·2022년 2월 22일
1

서론

intern() 에 대해서 알아보던 중 String constant pool이 perm 영역에서 Heap 영역으로 옮겨졌다는 사실을 알게된 후 Perm 영역이 무엇인지 알아보던 중 JAVA 8버전부터 Perm 영역이 사라졌다는 것을 알게 되었다. Perm 영역이 사라지고 Metaspace 영역으로 대체된 이유와 어떤 효과를 가져오는지 알아보았다.

Perm 영역이란?

JAVA 7버전 까지 존재 했던 영역으로 다음과 같은 정보들을 저장하는 영역이다.
1. Class 의 Meta정보
2. Method의 Meta 정보
3. Static Object
4. Class와 관련된 배열 객체 Meta 정보
5. JVM 내부적인 객체들과 최적화컴파일러(JIT)의 최적화 정보

이 영역은 JVM에 의해 영역의 크기가 결정된다.

JAVA 7버전 부터는 String constant pool이 Heap 영역으로 이동되어 GC의 대상에 포함 됐고
JAVA 8부터 Perm 영역이 사라지고 metaspace영역으로 대체 되었다.

Metaspace 영역이란?

기존에 Perm 영역에 저장되었던 Class의 Meta정보가 이 영역에 저장된다.
Native Memory 영역에 위치하며 JVM이 아닌 OS레벨에서 관리된다.
기본적으로 영역 크기의 제한이 없다.

Perm 영역이 사라지고 Metaspace 영역으로 대체된 이유?

Perm 영역은 Permanent Heap으로 JVM에 의해 관리되던 영역이다. 개인적인 생각으로는 이 영역은 JVM이 관리하는 영역이고 기본적으로 크기가 제한되므로 OS 레벨에서 관리되는 영역의 크기보다 작으며 그에 따라 OutOfMemoryError가 비교적 빈번하게 발생될 수 있다.
Metaspace 영역의 크기는 사용하는 만큼 자동으로 늘어날 수 있고 시스템의 메모리의 상한선 까지 사용할 수 있는것 같다. 그렇기 때문에 개발자는 상한선을 크게 의식할 필요 없이 개발을 할 수 있다.

하지만 무작정 영역 크기의 제한없이 사용하기보다는 최적의 설정값을 찾아 메모리 낭비를 방지해야한다. 메모리 누수가 계속 발생하는 경우 영문도 모른채 시스템 메모리를 모두 잡아먹을지도 모른다.

요약

  • perm 영역은 metaspace로 대체되었다.
  • metaspace 영역은 perm 영역에 비해 비교적 OOM 발생 확률이 적고, 개발자들은 이 문제를 의식해야 하는 수고가 덜어졌다.

0개의 댓글