티스토리 뷰
JVM 성능과 관련된 JVM Component 는 아래 세가지 이다.
- Heap
- JIT Compiler
- Garbage Collector
대부분의 성능 튜닝은 Heap 의 사이즈를 조절하는 것과 가장 적저한 Garbage Collector 를 선택 하는것이다.
JIT Compiler 또한 성능에 큰 영향이 있지만 새로운 버전의 JVM 에서만 드물게 튜닝이 필요하다.
자바 튜닝에는 2가지 주요 목표가 있다. 대응성 & 처리량
대응성
대응성이란 응용프로그램 또는 시스템이 얼마나 빨리 요청받은 데이터를 응답하느냐에 대한 것이다.
긴 "Pause Time" 을 갖는 응용프로그램은 높은 대응성을 가지고 있다고 할 수 없다.
초점은 빠른 시간내에 응용 프로그램이 반응하는것이다.
처리량
처리량은 응용프로그램이 정해진 시간에 처리할 수 있는 일을 최대화 하는 것이다. 처리량은 아래와 같은 예제로 측정할 수 있다.
- 주어진 시간동안 완료할 수 있는 트랜잭션 수
- 1시간 동안 완료할 수 있는 배치 Job 의 수
- 1시간 동안 데이터베이스가 처리할 수 이는 쿼리 수
긴 "Pause Time" 은 처리량 관점에서는 용납할 수 있다. 빠른 대응 보다는 주어진 시간에 얼마나 많은 처리를 할 수 있는지에 중점을 둔다.
Automatic Garbage Collection
Automatic Garbage Collection 이란 Heap Memory 에 어떤 객체들이 사용중인지 사용이지 않은지 구별한 후에 사용하지 않는 객체를 제거하는 과정이다. 사용중인 객체란, 프로그램이 객체를 여전히 참조하고 있는 것이다. 사용되지 않는 객체란, 프로그램이 어느곳에서도 더 이상 참조하지 않는 것이다.
C 언어와 같은 언어는 메모리 할당과 해제는 수동으로 처리 해야만 한다. 하지만 자바의 메모리 헤제는 Garbage Collector 에 의해서 다루어 진다.
Step 1: Marking
GC 의 첫번째 단계는 Marking 이다. Garbage Collector 가 메모리의 어떤 부분이 사용중이고 사용중이지 않은지 구분하는 단계이다.
참조되고 있는 객체는 파란색. 참조되고 있지 않은 객체는 주황색이다. Marking 단계에서 모든 객체는 이 결정을 위해서 스캔된다. 만약에 시스템 내의 모든 객체를 스캔해야 한다면 시간 소모가 클것이다.
Step 2:Normal Deletion
Normal deletion 단계는 참조되고 있지 않은 객체를 제거하고 포인터를 빈 공간으로 둔다.
Memory Allocator 는 새로운 객체가 할당될 수 있는 빈 공간 블락의 참조를 가지고 있는다.
Step 2a : Deletion with Compaction
성능 개선을 위하여, 참조되지 않는 객체를 지울 뿐만 아니라 참조가 되고 있는 객체들을 압축할 수 있다. 참조되고 있는 객체를 옮김으로서 새로운 메모리 할당을 더 빠르고 쉽게 할 수 있다.
Generational Garbage Collection
JVM 안에 있는 모든 객체를 Mark 하고 압축하는 것은 비효율적이다. 점점 더 많은 객체가 할당되고 객체 리스트가 점점 더 커질수록 Garbage Collection 에 소비되는 시간은 점점 커진다. 그러나 경험적인 분석에 의하면 대부분의 객체는 할당 된 후에 곧 제거된다.
위 그림에서 볼 수 있듯이, 시간이 지날 수록 매우 적은 객체만 남아있다. 사실 대부분의 객체는 그래프의 왼쪽부분에서 볼 수 있듯이 매우 짧은 시간만 사용된다.
출처 : https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
'JAVA' 카테고리의 다른 글
Java Garbage Collector 의 종류 (0) | 2020.05.06 |
---|---|
JVM Generation 과 GC 과정 (0) | 2020.05.06 |
Error 와 Exception (0) | 2020.05.02 |
Abstract vs Interface (0) | 2020.04.30 |
JAVA 접근 제어자 - access level modifier (0) | 2020.04.30 |
- Total
- Today
- Yesterday
- Flux
- circurit breaker
- rate limit
- mariada-connector
- notify()
- AbstractMethodError
- reative
- ConcurrentHashMap
- RouteDefinition
- aurora
- dynamodb
- referencedColumnName
- ResultSet
- wait()
- RoutePredication
- GlobalFilter
- getBoolean
- msyql-connector-java
- DyanomoDB
- N+1
- MariaDB
- reactor
- custom config data convertion
- mariadb-connector-j
- notifyAll()
- spring cloud gateway
- Seperate Chaining
- Lazy
- HashMap
- router
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |