JVM ,GC
태그 :
- 개념
- JVM(Java Virtual Machine) 메모리 상에만 존재하는 가상 컴퓨터, 자바의 소스 코드를 컴파일 하게 되면 바이트 코드로 변환되는데 JVM은 이러한 바이트 코드를 읽어서 실행할 수 있도록 해주는 도구 GC(Garbage Collection) GC는 Java Application의 구동환경인 JVM(Java Virtual Machine)의 중요 기능모듈이며, Java Application 동작 시 더 이상 참조되지 않는 메모리를 자동 수거하는 기능으로 Java언어가 가지는 중요한 특징 중 하나임
I. JAVA 프로그램 실행도구 JVM의 개요
가. JVM(Java Virtual Machine)의 정의
- 메모리 상에만 존재하는 가상 컴퓨터, 자바의 소스 코드를 컴파일 하게 되면 바이트 코드로 변환되는데 JVM은 이러한 바이트 코드를 읽어서 실행할 수 있도록 해주는 도구
나. JVM의 특징
- 다른 인터프리터 방식의 언어(ex. BASIC)보다는 상당히 빠른 수행능력을 보이지만, 일괄 컴파일 방식 언어(ex. C, C++)보다는 수행 속도가 느림
-> JVM이 컴파일하여 생성한 byte code를 사용하긴 하지만, JVM이 실행 중에 byte code를 native code로 변환하는 시간이 필요
- 컴파일된 JAVA프로그램은 어느 OS에서도 실행 가능함
II. JVM의 구성도 및 구성요소
가. JVM의 구성도
- JVM은 크게 Class Loader, Execution Engine, Run-time Data Area, Garbage Collector로 구성됨
나. JVM의 구성요소
구성 |
내 용 |
---|---|
클래스 로더 (Class Loader) |
- HelloWorldApp.class 파일을 메모리에 올려서 실행하는 부분을 담당함 - Class Loader로 인해서 “.class” 확장자의 파일은 플랫폼에 독립적으로 JVM(Java Virtual Machine)이 설치된 환경에서는 Java프로그램을 실행 할 수 있음 |
실행 데이터 영역(Run-time Data Area) |
- 클래스 로더에서 준비한 HelloWorldApp.class에서 수행하면서 활용할 데이터를 보관 - 메소드영역(Method area), 힙영역(Heap area), 스택영역(Stack area), Native Method 스택, PC 레지스터(Register) 영역으로 구성됨 |
실행엔진 (Execution Engine) |
- HelloWorldApp.class 파일이 클래스 로더에 의해서 메모리에 정상적으로 로딩되고, 실행 엔진에 의해서 프로그램이 수행됨 - JVM(Java Virtual Machine)이 읽을 수 있도록 만들어진 “.class” 파일 해석기 |
가비지 콜렉터 (Garbage Collector) |
- Multi Process 환경에서 다수의 HelloWorldApp.class 파일이 수행되면서 힙 메모리에 남아있는 데이터를 효율적으로 관리(삭제)하는 역할 - 프로그램환경에서 메모리 관리 기능 담당 |
III. Java 프로그램의 프로세스
실행 순서 |
내 용 |
Java Source |
- HelloWorldApp.java: 최종 화면에 “Hello World!” 출력하는 프로그램 수행 Class HelloWorldApp { Public static void main (String[] args) { System.out.println(“Hello World!”); } } |
Java Compiler (javac) |
Java언어로 소스코드 작성된 것을 기계가 이해할 수 있는 언어(Byte Code)로 번역하는 역할 수행, JVM이 해석할 수 있는 언어로 만드는 과정. |
JVM(Java Virtual Machine) |
컴파일 된 Java프로그램 HelloWorldApp.class를 플랫폼(OS) 환경에서 실행할 수 있는 역할 수행 |
Class Loader: Runtime시 동적으로 Class 읽기 |
|
Execution Engine: Byte code를 실행하는 Runtime Module |
|
Runtime Data Areas: 수행하면서 활용할 데이터 보관 |
IV. 자동 메모리수거기능, GC의 개요
가. Gabage Collection의 정의
- GC는 Java Application의 구동환경인 JVM(Java Virtual Machine)의 중요 기능모듈이며, Java Application 동작 시 더 이상 참조되지 않는 메모리를 자동 수거하는 기능으로 Java언어가 가지는 중요한 특징 중 하나임
- C언어 등은 Malloc(), Free()등을 이용하여 메모리를 할당하고, 사용 후 일일이 수거해주어야 함
나. GC의 특징
<그림: 개발자 및 어플리케이션 품질 측면에서 GC의 중요성>
- GC는 개발자로 하여금 메모리 관리에서 자유롭게 해주며, 복잡한 메모리 관리를 위해 코드를 줄여줌으로써 가독성과 유지보수성을 향상시켜 어플리케이션의 오류발생 감소 등 품질을 향상시킴
V. GC 동작 매커니즘
- ava Application는 아래와 같은 Heap구조를 가지며, 구조 내 영역별 특성에 따라 Minor GC와 Full GC로 분류됨
가. GC를 위한 java 메모리 (Heap)구조
- Java Appication 동작시 오래 유지되는 객체와 그렇지 않은 객체를 보관하기 위해, 크게 두가지 영역(Young, Old)으로 메모리를 나누어 GC의 효율화를 보장함
나. GC 동작 메커니즘
1) Minor GC 동작 매커니즘(Young, Old)
-예: Copy & Scavenge (1) Eden에서 Alive된 객체와 Survivor1으로 이동, Eden 영역을 Clear (2)영역에서 Alive된 객체와 Survivor1영역에 Alive된 객체를 Survivor2에 복사, Eden영역과 Survivor1영역 Clear (3)같은 원리로 Eden과 Survivor2영역에 Alive된 객체를 Survivor1에 복사, Eden영역과 Survivor2영역 Clear (4)위 방법을 반복 수행, 이때 오래된 객체를 Old영역으로 이동시킴 |
2)Full GC 동작 매커니즘: Old 영역의 GC
-예: Mark & Compact (1)전체 객체들의 Reference를 따라가면서 Reference가 연결되지 않은 객체를 Mark (2)Mark된 객체를 삭제 |
3) GC의 주요 알고리즘
분류 |
알고리즘 |
특징 |
지원 |
Minor GC |
Copy & Scavenge |
-고속, 작은 크기의 메모리를 Collection하는데 효과적 |
|
Parallel GC |
-Multi Thread를 이용해 Minor GC를 좀더 빠르게(병렬로) 수행 |
1.4 |
|
Full GC |
Market & Compact |
-전체 객체의 사용유무를 Mark하고, Mark된 객체를 삭제함 -저속, 순간적으로 App멈춤 현상이 발생하므로 App의 성능과 안정성에 영향을 줌 |
|
Concurrent GC |
-Full GC 수행시 시스템멈춤(Pause)현상 최소화 -일부 GC는 APP가 동작하는 단계에서 수행하고, 최소한만 App를 멈추고 수행함 |
1.4 |
|
Other |
Incremental GC (Train GC) |
-Minor GC수행 시 Full GC영역을 조금씩 수행 -Full GC횟수와 시간을 줄이는 방법 |
1.3 |
- 현재 다양한 알고리즘이 존재하고 또 지속적으로 개발되고 있으며, Appcation형태(Client/Server, Long/Short등)나 H/W Spec(CPU 수, Hyper Threading여부)에 따라 충분한 테스트를 거쳐 적합한 GC알고리즘 선택하는 것이 Application의 성능을 향상시킬 수 있는 방법 중 하나임
VI. JVM성능 최적화 방안
- Full GC의 경우 매우 속도가 느리며, 수행시 Appication이 멈춰 버리기 때문에 수행빈도와 소요시간에 따라 Application의 성능에 큰 영향을 주므로 최적화 방안이 필요함
가. GC알고리즘의 적절한 선택
- Application의 형태나 HW Spec(CUP수, Hyper Threading 지원여부)에 따라 충분한 테스트를 거쳐 적합한 GC알고리즘 선택
나. JVM GC 튜닝
분류 |
튜닝방법 |
App의 종류와 튜닝 목표값 결정 |
-최소 메모리 사용, GC횟수/소요시간 줄이기 등의 Application성능향상 목표수립 후 JVM Parameter 조정 |
Heap size와 Perm size 설정 |
-ms와 mx 옵션을 이용해 Heap Size 조정 -일반 Application의 경우 ms와 mx사이즈를 동일하게 주는 것이 효과적 |