개발

JVM 메모리 구조 및 JVM 튜닝

snow-line 2020. 8. 13. 18:36
반응형

jvm 튜닝에 앞서 jvm 메모리 구조에 대해 먼저 알아보겠습니다.

1. Method Area (메서드 영역)

 - 클래스 멤버 변수의 이름, 데이터 타입, 접근 제어자 정보, 필드 정보, 메서드의 이름, 리턴 타입, 파라미터 등의 변수 등이 생성되는 영역

 

2. Heap Area(힙 영역)

 - new 키워드로 생성된 객체와 배열이 생성되는 영역

 - 메서드 영역에 로드된 클래스만 생성이 가능하고 Garbage Collector가 참조되지 않는 메모리를 확인하고 제거하는 영역

 

3. Stack Area(스택 영역)

 - 지역 변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값 등이 생성되는 영역

 

4. PC Register (PC 레지스터)

 - Thread가 생성될 때마다 생성되는 영역으로 Program Counter로 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역

 

5. Native Method Stack

 - 자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역

 - 보통 C/C++ 등의 코드를 수행하기 위한 스택(JNI)

1. JVM 튜닝 필요성

 - Xms 옵션과 Xmx 옵션 메모리 설정 없이 사용중일때

 - JVM 옵션에 -Server 옵션이 설정되어 있지 않을 때

 - 시스템에 Timeout 같은 로그가 발생하면서 정상적인 트랜잭션 처리가 이루어지지 않을 때

 

2. 튜닝 목적

 - 첫번째로 Old Area로 넘어가는 Object의 수를 최소화해야 합니다.

 - Full GC의 실행 시간을 줄여야 합니다.

 

3. Object 수 최소화 방법

 - String 대신 StringBuilder나 StringBuffer 사용해야 합니다.

 - 로그를 최대한 적게 쌓도록 해야 합니다.

 - 대용량 XML 파일을 사용하지 않도록 해야 합니다. (현실적으로 이렇게 하기에는 어려움)

 - Object의 수를 줄이면 Old Area로 이동하는 Object의 수가 줄어들면서 Full GC 발생하는 빈도가 줄어듭니다.

 

4. Full GC Time 줄이기

 - Full GC Time 이 1초를 넘기지 않도록 설정해야 합니다.

 

5. GC 확인 방법

 - catarina.sh 에서 xloggc 옵션으로 gc 이력을 남겨야 합니다.

 - gc 분석 툴을 사용해 gc 시간을 확인해야 합니다.

 

6. 메모리 설정

 - 32GB 보다 힙이 작을 때는 Object Pointer를 압축하는 트릭을 사용해야 합니다.

 - 32GB가 넘어가면 각 포인터의 사이즈가 늘어납니다.

 - 32GB를 넘길 경우 메모리 낭비, CPU 성능 하락, GC 부담이 증가합니다.

반응형

'개발' 카테고리의 다른 글

리눅스에서 apache + tomcat 연동 방법  (0) 2020.08.16
해시(Hash) 기본 개념과 구조  (0) 2020.08.13
Centos7 jdk 1.8 설치  (0) 2020.08.10
리눅스 mysql(5.5.9) 설치 방법  (0) 2020.08.08
AngularJs 보안 가이드  (0) 2020.07.28