반응형

자바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 최대 사이즈 설정.

 


[참고자료]

더 자바, Java 8, 백기선

PermGen Elimination project is promoting

[Java Memory Profiling에 대하여]① JVM 메모리 이해와 케이스 스터디

[Java Memory Profiling에 대하여]② 메모리 모니터링과 원인분석

Java 8: From PermGen to Metaspace

One important change in Memory Management in Java 8

반응형

+ Recent posts