기존구성
- WebLogic v10.3.0
- JDK6
구성변경
- WebLogic 버전 변경 (v10.3.0 => v10.3.6)
1004lucifer
증상
- WebLogic 기동 후 20~40분 정도 지난 시점에 Full GC가 발생하고 조금 더 시간이 지나 Full GC 발생 시 메모리 확보가 되지 않아 연속적으로 Full GC가 발생을 하게된다.
(거의 1,2초마다 Full GC가 발생함.)
한참 지속 후 OOME 발생
해결방법 (조치사항)
- JDK버전 변경 (JDK6 => JDK7)
- Heap Memory 용량 변경 (Xmx:1024m => Xmx:2048m)
분석과정
1. Request 가 들어오면서 Heap Memory를 모두 사용하자 Full GC가 너무 짧은 주기로 연속적으로 발생을 했다.
2. Java(WebLogic) Heap Memory Dump 분석
(Full GC가 발생할 당시에 Dump 생성)
1) 힙메모리의 대부분이 세션객체로 사용됨
- Session Timeout 시간을 짧게 줄일 필요가 있음.
- 기본값(60분)이 너무 길어 세션객체가 GC대상에 포함되지 않음.
1004lucifer
2) 힙메모리 용량이 너무 낮음
- 메모리를 2G정도로 늘릴 필요가 있음.
3. 세션시간 설정 적용불가
- web.xml, weblogic.xml 파일 수정 시 timeout 적용되지 않음. (원인 모름)
- 힙메모리(Xmx)만 2048m 으로 수정함.
4. JDK 업그레이드 및 테스트
1) 힙메모리 1GB 시 Full GC 발생되기까지 시간
- JDK6: 약 20~30분 소요
- JDK7: 약 70~80분 소요
2) 힙메모리 2GB 시 Full GC 발생되기까지 시간
- JDK7: 약 2시간 30~40분 소요
PS.
1. Full GC 이슈에 대한 생각
1) Request가 많아 세션객체가 60분이 지나기전에 힙메모리를 모두 사용하는 상황이 발생하여 Full GC가 발생.
2) 하지만 세션객체가 60분이 지나지 않았기 때문에 세션객체를 GC대상에 포함할 수는 없어 Full GC 후에도 확보되는 여분의 메모리는 거의 없음.
3) 남은 메모리가 거의 없으니 금방 Full GC 발생.
4) 이후부터는 연속적으로 Full GC 발생
2. 왜 WebLogic v10.3.6 에서만 문제가 발생할까
- v10.3.0 에 비해서 WebLogic 내부적으로 많은 변화가 있으며 무거워졌다고 함.
- v10.3.6으로 바뀌며 세션객체 1개가 가지는 데이터의 양이 늘어났을 수도 있다고 추측됨.
3. 왜 JDK7에서는 Full GC까지 시간이 오래 걸리는 것일까
- JDK7(JVM) 에서의 메모리 관리방법이 변경된 것으로 예상
- JDK6에서 변화된 String Intern(링크)과 비슷한 것으로 예상됨.
4. 조치방법의 이유
- 세션 timeout 변경이 불가한 상황에서 60분 이내에 Full GC가 발생하면 안되며 Full GC가 발생하는 시점이 길면 길수록 세션객체가 GC대상에 들어가게되어 Full GC 발생 시 확보가능한 메모리의 용량이 늘어나게 되어 기존 이슈가 발생할 확률이 거의 없어진다고 생각된다.
댓글
댓글 쓰기