Java Memory Management

Java memory Management : 


Garbage Collection (GC) 
- Java 내부의 자동화된 메모리 관리 기능
- 메모리의 할당, 메모리 내의 객체 레퍼런스 관리, 객체로 부터 메모리 환원 등의 역할을 수행한다. 


Garbage Collectors

GC의 목표 요구사항 : 

1. Maximum pause time goal : 
- Maxium pause time goal은 메모리를 복구하는데 어플리케이션이 GC로 인해서 멈추는 시간에 대한 기대치이다. 

2. Throughtput goal :
- Throughtput goal은 어플리케이션 타임에 대한 기대값이나 혹은 GC 이외 부분에서 소비되는 시간을 말한다. 

Garbage Collector의 타입 : 

1. Serial Collector : 
- 하나의 CPU에서 단일 쓰레드로 실행되는 컬렉터이다. 
- GC가 실행되면 어플리케이션은 GC가 완료될때까지 멈춰 있는다. 
- 이 컬렉션은 작은 데이터 셋을 가진 어플리케이션 100Mb내외, 그리고 low pause time을 필요하지 않는데 이용된다. 
- 현재 사용할 이유가 없는 GC

2. Parallel Collector : 
- Parallel Collector은 응답속도가 빠른 컬렉터로 알려져 있다. 이는 복수의 CPU에서 복수의 스레드로 실행이 된다. 
- 이는 GC속도를 매우 빠르게 향상시키고자 할때 이용된다. 
- 이는 pause time 제약이 없고, 어플리케이션 성능이 매우 중요할때 사용된다. 

3. Parallel Compacting Collector
- Parallel Compacting Collector는 parallel collector과 유사하다. 다만 컬렉션 pause time를 줄이는 알고리즘이 다르다. 
- 이 컬렉터는 pause time 제약이 있는 경우 사용하면 좋다. 
- J2SE 5.0 update 6 이상부터 사용이 가능하다. 

4. Concurrent Mark-Sweep Collector
- Concurrent Mark-Sweep Collector(CMS)는 낮은 지연을 가진 collector로 알려져 있다. 이것은 GC pause가 오래 걸리는 큰 컬렉션을 수행하는데 적합한 옵션이다.
- 이 컬렉션은 response time이 throughtput time이나 GC pause보다 더 중요할때 사용된다. 

5. Garbage-First(G1) Collector
- Garbage-First collector는 G1 Collector로 불리며 큰 메모리에서 북수 프로세서 머신을 위해 사용되는 GC이다. 
- 이는 pause time goals를 목표로 하며, 높은 throughtput을 위해 사용된다. 
- 전체 heap 오퍼레이션은 어플리케이션 스레드들과 함께 병렬로 수행된다. 이것은 힙 혹은 라이브 데이터 크기에 비례해서 인터럽션을 방지하는 기능을 가진다. 
- Java SE-7 update 4 이상부터 사용이 가능하며, GMS를 대체하기 위한 목적으로 만들어 졌다. 

Memory management tools

  • visualvm : All-In-One의 자바 트러블 슈팅 툴
  • jconsole : Java Management Extensions 를 따르는 모니터링 툴
  • jinfo : 설정 정보 툴
  • jmap : 메모리 맵 툴
  • jstack : 스택 트레이스 툴
  • jstat : JVM 통계 모니터링 툴
  • jhat : 힙 메모리 분석 툴
  • HPROF Profiler : CPU사용, 힙 통계, 모니터링 상태 프로파일러
  • jdb : 자바 디버깅 툴 

Command-Line Options : 

다음은 GC 관련된 커멘드 라인 옵션들이다. 이것은 Java 인터프리터에 전달된다.
-XX:+PrintGC or -verbose:gc
    힙과 가비지 컬렉션에 대한 각 컬렉션별 일반정보를 출력한다. 

-XX:+PrintCommandLineFlags -version 
    힙 설정, -XX값으로 지정된 값들, 버전 정보들을 출력한다. 

-XX:+PringGCDetails
    힙과 가비지 컬렉션에 대한 정보로 각 컬렉션이 수행되는 동안 상세 정보를 출력

-XX:+PrintGCTimeStamps
    PrintGC 혹은 PrintGCDetails로 부터 출력되는 정보에 타임 스템프를 추가한다. 

-XX:+UseSerialGC
    serial collector를 활성화 한다. 

-XX:+UseParallelGC
    parallel collector를 확성화 한다. 

-XX:+UseParallelOldGC
    parallel compacting collector를 활성화 한다. (노트 : Old는 "old" generation GC를 위해 사용되는 새로운 알고리즘이라는 것을 가리킨다. )

-XX:+UseParNewGC
    parallel young generation collector를 활성화 한다. 이는 concurrent low pause collector과 함께 사용될 수 있다. 

-XX:+UseConcMarkSweepGC
    CMS collector를 활성화 한다. 이는 parallel young generation collector과 함께 사용된다. 

-XX:+UseG1GC
    Garbage-First collector를 활성화 한다.

-XX:+DisableExplicitGC
    명시적인 GC (System.gc())기능을 disable한다. 

-XX:+ParallelGCThreads=[Threads]
    GC쓰레드의 수를 정의한다. 기본적으로 CPU의 수에 따라 결정된다. 이 옵션은 CMS와 Parallel collector에 적용되는 옵션이다. 

-XX:+MaxGCPauseMillis=[milliseconds]
    GC에 힌트를 주는 것으로 최대 pause time goal를 밀리세컨으로 설정하도록 한다. 이 옵션은 parallel collector에 사용된다. 

-XX:+GCTimeRatio=[__value__]
    GC에 힌트를 주는 것으로 어플리케이션 시간대비 GC 시간의 비율을 지정한다. (1 / (1 + [ value ] )) 로 계산되며 이는 요구되는 throughtput goal을 나타낸다.
    기본값은 99이며, 이는 어플리케이션은 99%로 수행되고 GC는 1%의 시간으로 수행됨을 의미한다. 이 옵션은 parallel collector에 사용된다. 

-XX:+CMSIncrementalMode 
    CMS Collector를 위해서만 사용되는 옵션으로 Incremental mode를 켠다. 하나 혹은 2개의 프로세스에 대해서 머신에 사용된다. 

-XX:+CMSIncrementalPacing
    CMS 컬렉서에만 사용되는 것으로 자동 패킹을 활성화 한다. 

-XX:+MinHeapFreeRatio=[percent]
    전체 힙 크기에서 free가 차지하는 최소 비율을 지정한다. 기본은 40%이다. 

-XX:+MaxHeapFreeRatio=[percent]
    전체 힙 크기에서 free가 차지하는 최대 비율을 지정한다. 기본값은 70%이다.

-Xms[bytes]
    최소 힙 크기를 지정한다. 기본 값은 : 시스템 물리 메모리의 1/64 값이다. 초기 힙 크기가 4Mb를 머신을 위해서 설정한다. 

-Max[bytes]
    최대 힙 크기를 지정한다. 기본은 물리메모리의 1/4 보다 작아야 한다. 최대 힙 크기를 64mb를 머신을 위해서 지정한다. 

-Xmn[bytes]
    young generation을 위한 힙의 크기를 지정한다. 

-XX:OnError=[command_line_tool [__options__]]
    fatal에러가 발생했을때 특정 사용자를 위해 스크립트나 커맨드를 사용할 수 있도록 한다. 

-XX+AggressiveOpts
    성능 옵티마이제이션을 수행한다. 앞으로 릴리즈에서는 이 값이 기본이 될 것이다. 

주의 : -XX옵션은 안정화 된 버젼을 보장하지 않는다. 이는 Java Language Specification의 파트가 아니다. 서드파티에서 제공하는 기능이다. 


Metaspace

네이티브 메모리는 클래스 메타의 표현을 위해 사용되는 Metaspace라는 메모리 공간을 생성한다. Metaspace는 PermGen 모델을 계승한다. 이러한 이유로 JDK 8 HotSpot JVM에서는 더이상 PermGen OutOfMemoryError를 볼수 없게된다. JVisualVM은 메타스페이스를 지원하는 분석결과를 제공한다. 만약 메모리 릭이 발생하면 이를 확인할 수 있다. 

























Share this

Related Posts

Previous
Next Post »