JVM 구조
유지보수를 진행하다 처음보게 된 Out Of Memory .. 굉장히 난감했었으나 다행히 해결하게 되어 글로써 남기고자 합니다 ㅋㅋ
개인이 공부할 때나, 개발 도중 단위 테스트만으로는 발견하기가 쉽지 않은 에러입니다.
Out Of Memory 에러의 해결방법으로는 JVM 옵션과 Dump 파일 분석. 두 가지의 방법으로 해결할 수 있습니다.
( 옵션 설정을 통해서 대부분 해결이 가능하지만, 설계가 잘못된 경우에는 옵션 설정은 임시방편 밖에 되지 못합니다.
그럴경우 덤프파일을 통해 정확한 원인을 분석해야 합니다.)
먼저 JVM 구조에 대해 간단히 살펴보고 가겠습니다.
자주 발생하는
Java.lang.OutOfMemoryError: Java heap Space
Java.lang.OutOfMemoryError: Permgen space
에러의 주된 영역인 Heap 영역과 Permanent 영역에 대해 추가로 말씀드리겠습니다.
Heap 영역은 위 그림에서 보시듯이 Object 들이 저장되는 공간입니다.
예를 들어 아래와 같은 코드가 있다고 가정하겠습니다.
Member member = new Member();
여기서 new 명령을 통해 생성된 Member 인스턴스가 힙 영역에 저장되는 것입니다.
그리고 member 참조변수는 생성된 인스턴스의 힙 영역을 가리키며, Stack 영역에 저장됩니다.
즉, Java.lang.OutOfMemoryError: Java heap Space 에러는 할당된 영역에 Object들이 꽉 찼다는 의미가 됩니다.
(객체가 할당된 Heap 영역에 비해 너무 많이 생성되었다고나 할까요..?)
그렇다면 Permanent 영역이란 어떤 역할을 하는 곳일까요.
간단히 말씀드리면 Permanent 영역은 클래스들의 정의 정보가 저장되는 곳입니다.
Permanent 영역은 JVM이 객체의 생명주기가 길다고 판단되는 객체들을 이 영역에 할당하며, Permanent 영역에 있는 객체들은
GC(Garbage Collector) 의 대상에서 제외됩니다.
대부분 이 에러는 잘못된 설계에 의해 발생된다고 합니다. Permgen의 영역을 늘리는 것이 해결방안이 될 수도 있지만,
설계가 잘못되었을 경우 덤프파일을 통해 정확한 원인을 찾는 것이 중요합니다.
JVM Option
이제 위의 문제들을 JVM Option을 설정하여 해결해보겠습니다.
아래는 JVM Option에 대한 간략한 설명입니다.
JVM Option
자바의 최대 장점은 OS에 JVM만 설치되어 있다면, OS별로 따로 소스를 변경할 일이 없다는 점입니다. 이식성이 낮다고 표현하죠.
그러나 동작을 한다는 것이 성능을 보장해주진 않습니다. 그러므로 하드웨어,OS 별로 JVM의 설정을 변경하여 성능을 보장해주어야 하는데,
여기에 사용되는 것이 JVM Option 입니다.
JVM Option은 JVM 표준인 Standard 옵션과 Non-Standard 옵션으로 구분됩니다.
- Standard Option : JVM 표준 옵션으로 JVM을 만드는 회사에 상관없이 동일한 옵션을 가집니다.
- Non-Standard Option : JVM 표준이 아니며 Java의 버전, JVM 종류에 따라 달라지기도 합니다. 성능에 직접적으로 영향을 주며 -X , -XX로 시작됩니다.
위의 설명에서 보셨듯이 우리는 Non-Standard Option을 설정해주어야 합니다.
톰캣을 기준으로 해당 옵션은
서버가 실행될 때 참조하는 catalina.bat 파일에서 줄 수 있습니다.
catalina.bat 파일은 %CATALINA_HOME%\bin 폴더내에 위치합니다.
해당 설정을 변경하기 전 현재 JConsole을 이용해 현재 톰캣의 Heap Memory와 Permgen Memory의 크기를 보겠습니다.
- Heap Size
현재 1.8 기가 정도로 설정되어 있네요
- Permgen Size
80 메가 정도네요. Heap Size는 모르겠지만 Permgen Size는 80메가 정도가 디폴트 인 듯 합니다.
이제 각 사이즈를 늘려보도록 할까요.
catalina.bat 파일을 열어줍시다.
대충 상단 쯤에 위와 같이 선언해 줍니다.
- Xms<size>
: Java Heap의 최소 크기값을 지정하는 부분입니다.
- Xmx<size>
: Java Heap의 최대 크기값을 지정하는 부분입니다.
- XX:PermSize=<size>
: Permanent Generation의 최초 크기를 지정하는 값입니다.
- XX:MaxPermSize=<size>
: Permanent Generation의 최대 크기를 지정하는 값입니다.
톰캣 재시작 하시고 JConsole로 확인해 볼까요.
- Heap
- Permgen
잘 늘어났군요!
이상 포스팅을 마치겠습니다.
감사합니다.
참조 : http://www.nextree.co.kr/p3878/
'Server' 카테고리의 다른 글
JBOSS 시스템 프로퍼티 설정 (0) | 2016.08.17 |
---|---|
아파치 톰캣 연동 (0) | 2015.05.26 |
아파치 설정파일 구문 검사 (0) | 2015.05.06 |
아파치 VirtualHost 설정 (8) | 2015.05.05 |
JConsole 서버 모니터링 (1) | 2015.03.23 |