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 |