본문 바로가기
JAVA & JVM

JAVA Memory Option

by 샤워하다돌면워싱턴 2022. 8. 30.
반응형
-X Option
-Xss : 각 Thread별 Stack size (Thread의 Native Stack Size)
-Xms : 초기 Heap size (Young + Old)
-Xmx : 최대 Heap size (Young + Old)
-Xmn : Young(New) 영역 크기
 
-XX Option
-XX:PermSize : 초기 Permanent size
-XX:MaxPermSize : 최대 Permanent size
-XX:MaxPermSize : 최대 Permanent size
 -XX:SurvivorRatio=<n> : Eden 영역의 크기를 SS1 또는 SS2의 크기로 나눈값
-XX:NewRatio : Old/New Size 값이다. (전체 Heasp Size가 768m일때 NewRatio=2이면, New=256m, Old=512m으로 설정된다.)
 
메모리 산출 공식
YOUNG  = Xmn = Eden + SS1 + SS2
 Eden = YOUNG - ((Xmn/(SurvivorRatio + 2)) * 2)
 SS1 = (YOUNG - Eden)/2
 SS2 = (YOUNG - Eden)/2
 OLD = Xmx(heap영역) - Xmn(new영역)
 
-verbosegc
  자바 실행시 JVM 옵션에 -verbosegc 를 주면 GC 로그를 볼 수 있다.
 * 실행 결과
[GC 5971K->5481K(7748K), 0.0011015 secs]
 [GC 5993K->5498K(7748K), 0.0010708 secs]
 [GC 6008K->5523K(7748K), 0.0011719 secs]
 [GC 6027K->5588K(7748K), 0.0010359 secs]
 [GC 6089K->5695K(7748K), 0.0012088 secs]
 [Full GC 5737K->5641K(7748K), 0.0630893 secs]
 
 Minor GC는 "GC"로, Full GC는 "Full GC"로 나타난다.
6763K은 GC하기 전의 Heap Size이고, 6116K은 GC후의 Heap 사이즈를 나타낸다.
 (10172K)은 총 Heap Size이고, 0.0006613 secs은 GC 소요 시간이다.
 
java.lang.OutOfMemoryError
   - 프로그램에 메모리 누수등의 문제가 없다면, JVM 옵션으로 메모리를 늘려주면 된다. 이 OutOfMemory도 메모리 종료(?)별로 발생하는데, 가장 빈번하게 발생하는 놈은 heap과 PermGen이라는 놈이다.
java.lang.OutOfMemoryError: Java heap space
  - Heap 크기가 부족해서 나는것이다.
  - 해결책 : -Xmx 옵션을 이용해서 최대 Heap Size를 늘려준다.
java.lang.OutOfMemoryError: PermGen space
  - 동적 클래스를 많이 사용할 경우 발생한다. JSP->Server 변환이나, spring 같은 동적 클래스를 많이 사용하는 프레임워크를 사용할때 종종 발생한다.
  - 해결책 : -XX:MaxPermSize 옵션을 이용해서 Perm Size를 늘려준다.
기타
  - 이 외에도 Native Heap Space가 부족하거나, Thread Stack Space가 부족할 경우 발생하기도 하는데, 보통은 거의 볼 수 없으므로 생략.
    (Native Heap Space가 부족할 경우는 Heap 사이즈를 줄여주면 되고, Thread Stack Space가 부족할경우는 Thread 수를 줄이던지 Stack Size를 줄이면 된다.)
  - 32bit JVM일 경우 일반적으로 사용 가능한 메모리 크기는 4G이다.(OS에 따라 다르기도 하다) 232=4*230=4G이니까.
    하지만 프로그램의 버그때문에 메모리 누수현상이 발생하여 에러가 발생할경우는 참 난감할것이다.
   이럴 경우는 HProf나 Heap Dump를 이용해서 잘못된 부분을 찾는 수밖에 없다.  
   JMX(Java Management eXtensions) 등 JVM Memory의 실시간 모니터링 프로그램을 이용하길 바란다.
반응형

'JAVA & JVM' 카테고리의 다른 글

Class Loader  (0) 2022.08.30
Java Thread  (0) 2022.08.30
ParallelGCThreads, ParallelCMSThreads 계산법  (0) 2022.08.30
Garbage Collection Algorithm(가비지 컬렉션 알고리즘)  (0) 2022.08.30
JAVA란?  (0) 2022.08.30

댓글