본문 바로가기
programming/java

[java]JVM 구조

by 힐무새 2017. 12. 2.

먼저 컴파일부터 실행까지의 과정을 간단하게 요약하자면

  1. 컴파일러(javac)를 통해 .java 코드를 클래스 파일(바이트 코드)로 변환한다.

  2. 생성한 클래스 파일을 JVM에 로드.

  3. Excution Engine을 통해 바이트 코드를 해석.

  4. 해석된 프로그램은 Runtime Data Areas에 배치되어 실질적인 수행이 이루어지게 된다.

c, c++과 같은 언어가 object 파일을 생성 후 관련 파일들을 linking하여 .exe 파일로 생성하는 과정과는 차이가 있다. 왜냐하면 자바는 플랫폼에 독립적인 바이트 코드를 JVM 상에서 실행하기 때문에 이론적으로는 CPU, 운영체제에 무관하게 동일하게 동작할 수 있다.




JVM 구조
  • class Loader : JVM 내로 class 파일을 로드하고 Link를 통해 적절히 배치하는 일련의 작업을 수행하는 모듈. Runtime시 동적으로 class를 로드한다.
  • Execution Engine : class loader를 통해 JVM 내의 런타임 데이터 영역에 배치된 byte code를 실행. Execution Engine은 바이트 코드를 명령어 단위로 읽어서 실행한다.
  • Garbage Collector : JVM은 Garbage Collector(GC)를 통해서 자동화된 메모리 관리 기능을 제공한다. GC는 Garbage Collection을 수행하는 모듈 쓰레드를 말한다. Application이 생성한 객체의 생존 여부를 판단, 더 이상 사용되지 않는 객체를 해제함으로서 메모리 관리가 자동화 되도록 한다.
  • Runtime Data Area : JVM이라는 프로그램이 운영체제 위에서 실행되면서 할당받는 메모리 영역. 성능 상 문제가 주로 발생하는 영역이다.(Memory leak, Garbage Collection)


Runtime Data Area 구성 요소

  • Method Area
    클래스 파일의 바이트 코드가 로드되는 곳. 메인 메서드에서 사용하는 클래스, static 변수들이 method area에 적재된다. 모든 스레드들에 의해 공유됨. 이렇게 method area에 바이트 코드가 올라가는 것을 클래스 로딩이라고 함.(어떤 메서드가 실행되기 위해서는 그 메서드를 갖고 있는 클래스 파일이 메모리에 로딩되어 있어야 하기 때문)

  • Heap Area
    new 명령으로 만드는 객체(메모리)가 적재되는 공간. 지역변수와 다르게 메서드 호출이 끝나도 사라지지 않고 유지된다. 가비지컬렉터에 의해 지워지거나 종료되기 전까지. 배열과 객체가 해당된다.



Heap Area는 다음과 같이 구분되어 관리된다.

  1. New/Young area: 새로 생성된 객체들을 저장(Eden, S0, S1)
  2. Old area: 만들어진지 오래된 객체들을 저장
  3. Permanent 영역: JVM 클래스와 메서드 객체를 저장
New/Young 영역은 다시 
a) Eden : 모든 새로 만들어진 객체를 저장
b) Survivor Space 1, Survivor Space 2 : Old 영역으로 넘어가기 전 객체들이 저장되는 공간
으로 구분된다.

자바는 New/Young 영역과 Old 영역에 대해서만 GC를 수행한다. Permanent 영역은 코드가 올라가는 부분이기 때문에 GC가 필요없다.
  1. Minor GC
    new 영역의 GC를 Minor GC라 부른다. Eden 영역에 객체가 가득 차게 되면 첫번째 GC가 발생하게 된다. Eden과 s1의 객체를 s2로 복사하며, 그 외 참조되지 않은 객체들을 clear한다. 다음번 minor GC가 또 발생하게 되면 마찬가지로 Eden과 s2의 객체를 s1에 복사하고 참조되지 않은 객체들을 clear한다. 이러한 방식을 Minor GC라 한다. 객체가 생성된 시간이 오래 지나면 Eden과 survivor 영역의 오래된 객체들을 Old 영역으로 이동한다.

  2. Full GC
    Old 영역의 GC를 Full GC라 부른다. Full GC는 old 영역의 전체 객체들의 reference들을 따라가면서 참조되지 않은 객체를 mark한다. 이 작업 후에는 사용되지 않은 객체들이 모두 mark되고, 이 mark 된 객체를 삭제한다(실제로는 mark된 객체의 메모리 부분을 unmark된 객체로 메꾼다고 한다). Full GC는 속도가 매우 느리며, Full GC가 일어나는 도중에 순간적으로 application이 멈춰 버리기 때문에, Full GC의 빈도와 소요 시간은 application의 성능, 안정성에 큰 영향을 준다.

  • Stack Area
    지역변수와 매개변수가 저장되는 공간. 객체에 대한 참조는 단지 그 주소(heap area 상의 객체 주소)만 저장된다.

  • PC Register
    현재 실행중인 JVM 주소를 가지고 있다. 각 CPU Instruction을 수행하며, 필요한 정보를 CPU 내의 레지스터에 저장한다. 연산 및 결과값을 메모리에 전달하기 전의 CPU 내 기억장치

  • Native Method Area
    자바 외 언어로 작성된 네이티브 코드를 위한 메모리다. C/C++ 등의 코드를 수행하기 위한 스택. native 메서드의 매개변수, 지역변수 등을 바이트 코드로 저장.






'programming > java' 카테고리의 다른 글

[java]리플렉션(reflection)  (2) 2017.12.04
JIT(just-in-time) 컴파일  (0) 2017.12.01
[java] 정규 표현식  (0) 2017.06.01
[java] StringBuilder, StringBuffer의 차이  (0) 2017.06.01
[java]thread  (0) 2017.06.01