JVM?

JVM?

JVM은 Java Virtual Machine의 약자로, 자바 바이트코드, .class파일을 를 실행할 수 있는 주체이다. 쉽게 말해서 자바를 코딩하고 실행하기 위해서 필요한 가상의 컴퓨터라고 생각하면 된다. JVM은 운영체제에 의존적이므로 사용하는 OS에 맞는 JVM을 설치해야 한다.

image

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