JVM?
JVM
은 Java Virtual Machine의 약자로, 자바 바이트코드, .class
파일을 를 실행할 수 있는 주체이다. 쉽게 말해서 자바를 코딩하고 실행하기 위해서 필요한 가상의 컴퓨터라고 생각하면 된다. JVM
은 운영체제에 의존적이므로 사용하는 OS에 맞는 JVM
을 설치해야 한다.
JVM
은 스택 기반의 가상머신으로 메소드에서 호출되는 대다수의 명령어가 스택에서 피연산자를 택하고 연산 후 다시 결과를 스택에 저장하는 방식으로 이루어진다. Heap 영역에서는 Java Object들이 저장되는 공간으로 동적으로 할당되어 사용되어진다. Permanent Space는 Class에 대한 Meta정보를 저장하는 공간으로, Java Heap의 하위 영역이다.
JVM 옵션
-X Option
-Xms : 초기 Heap size 설정 -Xmx : 최대 Heap size 설정 -Xss : 각 Thread에 할당되는 Stack size 설정 -Xmn : New 영역을 위한 Heap size 설정
-XX Option
-XX:PermSize : 초기 Permanent size 설정 -XX:MaxPermSize : 최대 Permanent size 설정
영역별 OutOfMemoryError 대처 방법
Heap Area
Exception in thread “main”: java.lang.OutOfMemoryError: Java heap space Exception in thread main: java.lang.OutOfMemoryError: Requested array size exceeds VM limit
원인
Heap size의 부족으로 Java Object를 생성하지 못하여 발생
해결
- Xmx Option을 이용하여 최대 Heap size의 크기를 늘려줌
- Application 로직이 잘못되었거나 JDK나 WAS의 Bug로 인한 Memory 누수가 있는지 확인하여 수정
- finalize method에 의해 즉각적인 GC가 이루어지지 않으므로 로직 수정을 통해 해결
※ Object Allocation Profiling (Hprof)
java -Xrunhprof:heap=sites [Main Class] java -Xrunhprof:heap=sites,doe=n [Main Class] (Thread Dump 생성)
Permanent Space
Exception in thread “main”: java.lang.OutOfMemoryError: Perm Gen space’
원인
Permanent 저장 공간이 부족하여 발생.
-
JSP -> Servlet 변환, Reflection을 사용하여 동적으로 로딩되는 Class가 많은 경우에 발생할 수 있으며,
-
WAS의 Class Reloading 기능이 자주 실행 될 경우에도 발생할 수 있음.
해결
-XX:PermSize, -XX:MaxPermSize Option을 이용하여 크기를 늘려줌
※ Class Loading Monitoring java 실행시 -verbose:gc을 사용하여 Class가 Loading 되는 것을 Monitoring
참고 : http://fly32.net/438