티스토리 뷰

오답노트

OOME(OutOfMemoryError)

gajy 2022. 4. 13. 20:05
728x90

WAS상에서 JAVA기반 어플리케이션을 구동시키다 보면 OOM 혹은 OOME 에러를 만날 수도 있다.


JVM메모리 구조

  • Heap 영역 : Eden + Survivor + Old
    new 연산자로 생성된 객체와 배열을 저장하는 영역으로 GC(가비지 컬렉터) 대상이 되는 영역이다.
    • Eden : new 키워드를 통해 객체가 처음 생성되는 공간
    • Survivor : CG가 수행될 때 살아있는 객체는 survivor영역으로 이동한다(임시피난소)
    • Old : surviovr에서 일정시간 참조되는 객체들이 이동되는 공간
  • Non-Heap 영역 : Perm
    • Class 메타정보, method 메타정보, static Object 등 포함

 


에러가 나는 이유는 XX:MaxPermSize 옵션으로 지정하고 hot-deploy가 있을 때 메모리가 점차 증가한다. 그래서 이 부분 사이즈를 조절해주자.

XX:PermSize, XX:MaxPermSize를 조정한다.

 

JVM Option 정리

 

- Xms
초기 Heap Size (init, default 64m)
-Xmx
최대 Heap Size (Max, default 256m)
-XX:PermSize
초기 PermSize
-XX:MaxPermSize
최대 PermSize
-XX:NewSize
최소 new size (객체가 생성되어 저장되는 초기공간의 Size로 Eden+Survivor 영역)
-XX:MaxNewSize
최대 new Size
-XX:SurvivorRatio
New/Survivor영역 비율 (n으로 지정시 Eden : Survivor = 1:n)
-XX:NewRatio
Young Gen과 Old Gen의 비율 (n으로 지정시 Young : Old = 1:n)
-XX:+DisableExplicitGC
System.gc() 콜을 무시
-XX:+UseConcMarkWeepGC
표준 gc가 아니나 Perm Gen영역도 gc하는 Concurrent Collertor를 사용
- XX:+CMSPermGenSweepingEnabled
Perm gen영역도 GC의 대상이 되도록 지정
- XX:+CMSClassUnloadingEnabled
클래스 데이터도 GC의 대상이 되도록 지정

  • Hot Deploy 사용으로 재배포가 자주일어나는 시스템 환경인 경우

1. PermGen 영역의 사이즈를 충분히 늘린다(한계가 있다)

2. UseConcMarkWeepGC, CMSPermGenSweepingEnabled, CMSClassUnloadingEnabled 등의 옵션으로 PermGen영역도 GC 수행

**Hot Deploy : 서버의 재시작 없이 응용프로그램의 동적 변경을 바로 적용 시키는 기능으로 배치에서 테스트까지의 기간을 줄일 수 있으며 어플리케이션의 오류로 시스템의 장애 발생 시 단 시간 내에 조치가 가능한 장점이 있다.

 

  • Xms, Xmx를 동일하게 세팅한다. 이유는

-> Xms로 init 메모리를 잡고 comitted도달할 때 까지 Used용량이 점차 증가하는데, comitted에 도달 하고나서 메모리를 추가 할당시 시스템 부하가 발생 할 수 있다. 약 1초정도 jvm이 메모리를 할당하며 멈추는 경우가 발생한다.

 

참고: http://javaslave.tistory.com/23

728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31