GC의 역할
•
OS로 부터 메모리 영역을 확보
•
애플리케이션에서는 객체 생성 등 메모리가 필요할때 GC가 확보한 메모리 영역을 사용함
GC의 주요 테크닉
•
세대별 청소(generational scaveging)와 aging 기법을 사용해서 JVM Heap내에서도 회수할 만한 객체가 많이 있을 법한 영역에 집중.
•
살아있는 개체들은 한 곳에 모아서 최대한 연속된 free영역을 확보하려고 노력한다.
•
GC가 동작할 때 여러 스레드를 사용해 최대한 병렬로 동작할 수 있도록 하고, 오래 걸리는 GC작업은 백그라운드 애플리케이션 코드와 동시에 실행 될 수 있도록한다.
언제 GC 선택과 튜닝이 중요한가?
기술은 상황에 맞게 알맞게 설정해야된다.
기본적으로 작은 프로젝트나, 사이드 프로젝트에서는 GC를 튜닝할 정도로 큰 트래픽이 발생하지 않는다. 때문에 기본적인 설정값으로 프로그램을 진행해도 되는데, 스케일이 큰 애플리케이션, 특히 데이터를 많이 쓰고, 스레드들도 많이쓰고, 높은 처리량을 요구하는 애플리케이션 경우에는 성능을 위해 별도의 GC 선택과 튜닝이 필요할 수 있다.
•
소규모 시스템에서는 별 문제가 안될 GC로 인한 성능 이슈가 대규모 시스템으로 확장될 때는 주요 병목 짖머이 될 수 있다.
•
대규모 시스템에서는 GC 오버헤드를 조금만 낮춰도 성능 향상에 이점이 크기 때문에 적절한 garbage collector를 선택하고 필요하다면 GC 튜닝도 하는 것이 중요하고 가치있는 일이다.
•
자바는 네 개의 garbage collector를 제공하는데, 그 중 serial GC를 제외하고는 모두 선능 향상을 위해 병렬로 동작한다.
•
오늘날에 서버-클래스로 분류될수 있는 머신에서 애플리케이션이 실행된다. 보통 디폴트로 G1GC가 사용된다.
Ergonomics
Ergonomics : Jvm이 주어진 환경에서 GC와 메모리 관련 설정을 스스로 최적하는 것.
•
defatul selection : collector, heap size, GC Threads 수, Jit compiler
•
실행중 동적 조정
◦
아래 두 가지 목표를 맞추기 위해 사용자가 설정한 목표를 모니터링하여 실행 중에 동적으로 조정
▪
Maximum Pasue-Time goal(-XX:maxGCPasueMillis=nn)
▪
Throughput goal(-XX:GCTimeRatio=nnn)
◦
위 두가지 목표가 모두 충족되는 동안 minimun footprint를 추구하며 동작.
JVM의 주요 default 설정
•
garbage collector
◦
서버용 머신에는 G1GC, 그 외에는 Serial Collector 사용
▪
판단기준 : 두 개 이상의 프로세서를 가지며 RAM > 1792MB 인 경우
◦
inital heap size : JVM이 시작할 때 바로 확보되는 Heap 크기 : RAM의 1/64
◦
maximum heap size : JVM heap의 최대 크기 RAM의 1/4
◦
minimum heap size : 디폴트 값 설정이 약간 복잡하게 결정됨.
서버 애플리케이션의 경우 [inital heap size, maximum heap size , minimum heap size ] 를 동일하게 맞춰서 최대한 메모리를 사용하게 한다.
명령어
•
jps -l
◦
51379 com.ic.api.InterviewConnectApiApplication
•
jcmd 51379 VM.flags
•
XX:InitialHeapSize=536870912 > 512MB
•
XX:MaxHeapSize=8589934592 > 8GB
•
XX:MinHeapSize=8388608 > 8MB
현재 제 컴퓨터 기준 application의 유동적인 JVM




