[JAVA] Perm 영역, OUTOFMEMORY

반응형
1. Java7,8 Perm 영역 설정

-XX:PermSize=350m / 기동시 Perm사이즈
-XX:MaxPermSize=400m /최대사이즈

8이전 8이후
-XX:PermSize=350m / 기동시 Perm사이즈
-XX:MaxPermSize=400m /최대사이즈
-XX:MaxMetaspaceSize=
-XX:MetaspaceSize=
2. Java7까지 Permanent 영역에 포함되는 정보

1. Class 의 Meta정보 (pkg path 정보라고 보면 됨, text 정보)
2. Method의  Meta 정보
3. Static Object
  - static int i = 1; -> 1이라는 value가 Pemgen section 에 저장된다. 요즘 거의 발생하지 않지만 개발자가 Collection Object를 static으로 선언하고 값을 게속 추가하다보면 Perm이 가득차서 OOM이 발생하기도 한다. 
4. 상수화된 String Object
5. Class와 관련된 배열 객체 Meta 정보

 - JVM 기동시 사용되는 모든 Class와 Method Meta 정보가 Perm에 저장된다
static Object o = new SomeObject(); //the reference(pointer/memory address) is stored in the permgen section, the object itself is not.
6. JVM 내부적인 객체들과 최적화컴파일러(JIT)의 최적화 정보

 

3. Perm 영역 부족 원인 [Perm을 MAX를 정해놓고 할떄는 Perm이 꽉차면 OOM 발생]

1. Statuc Object의 잘못된 사용 (개발자 원인)
2. Class, Method Meta data 증가 (Hot Deploy가 원인)

4. Perm영역 부족에 의한 OOM 방지 방안

1. JSP Hot Deploy 금지

2. Perm 영역을 적절히 증가시키기
3. 정기적으로 재구동 -> 요건상 누수를 안고 가야 하므로 배포 주기나 일정기간 마다 통제된 환경에서 재구동 해주는 운영방법 사용

 

4. JAVA 8에서의 Perm영역은? Native 영역 [Metaspace영역 포함]

1. Class 의 Meta정보 (pkg path 정보라고 보면 됨, text 정보)  --> Native 영역으로 이동
2. Method의  Meta 정보--> Native 영역으로 이동
3. Static Object --> Heap 영역으로 이동
4. 상수화된 String Obejct  --> Heap 영역으로 이동
5. 클레스와 관련된 배열 객체 Meta 정보  -->  Native로 간듯하다
6. JVM 내부적인 객체들과 최적화컴파일러(JIT)의 최적화 정보 --> Native로 간듯하다.

- 기존 Perm에 저장되어 문자를 유발하던 Static object는 Heap영역으로 옮겨서 GC 대상이 최대한 될 수 있도록 하였다.

그리고 기타 정말 수정이 될 일 없어보이는 정보는 Native(Metaspace)로 몰아 넣고 사이즈는 자동적으로 조정하도록 개선되었다.

 

5. OOM 발생시 분석, 조치

JVM 장애시 Native Memory 영역의 누수는 분석이 불가능하다. Dump를 생성해도 Native영역 정보는 생성되지 않는다.

GC 정보보면서 Size를 늘려가는 방법 뿐일듯하다. 

반응형