Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Archives
Today
Total
관리 메뉴

미래학자

자바 동작 이해 본문

JAVA

자바 동작 이해

미래학자 2016. 12. 23. 23:23

JVM 내부 구조를 파헤쳐보자. 우선 그림을 통해 전체 구조를 살펴보자.


  • 클래스 파일 : 개발자가 자바 소스를 프로그래밍하면 확장자가 '.java' 이며 자바 컴파일러에서 컴파일 과정을 거치면 '.class'파일이 생성된다. 이 클래스 파일을 JVM에서 실행 가능하다. 이 클래스 파일들이 서로 유기적으로 동작하면서 하나의 프로그램이 수행하게 된다.
  • 클래스 로더 서브 시스템 : 자바 클래스 파일들은 OS에서 직접 동작하는 것이 아니라 JVM 위에서 동작한다. JVM은 실행할 클래스 파일을 읽고, JVM 메모리에 올려놓는 과정이 필요한데 이 과정을 클래스 로딩이라고 한다.
  1. JVM에서 실행할 클래스 파일의 내부 구조를 분석한다. 어떤 메소드가 있는지, 어떤 변수가 선언되어 있는지 그리고 각각의 성격은 어떤지 모두 분석한다.
  2. 분석된 내용을 바탕으로 설역ㄱ에 따라 구분하고 가각 JVM의 적합한 메모리 영역에 데이터를 올려놓는다.
  3. 분류된 데이터는 JVM 의 특별한 메모리 영역에 저장되어 있다가 클래스가 실행되면 JVM의 실행 영역의 힙 메모리로 복사된다. 그리고 시스템 리소스를 활용해서 클래스를 실행시킨다.
  • 실행 데이터 영역 : 클래스 로더로부터 분석된 데이터를 저장하고 실행 도중 필요한 데이터를 저장하는 영역을 실행 데이터 영역이라고 한다. 이 영역은 크게 다섯 개 영역으로 구분되며, 메모리 영역에 올라간 클래스, 객체, 변수들이 저장되는 곳이다.
  • 메소드 영역 : 클래스 로더에 의해서 로딩된 클래스가 저장되는 곳. 클래스에 대한 메타 정보(클래스 변수, 메소드)가 저장. JVM에서 클래스를 실행하면 메소드 영역에서 클래스 정보를 복사하여 힙 영역에서 메모리를 할당하여 실행.
  • 스택 영역 : 클래스릐 실행은 메소드 호출을 의미하고 이런 메소드 정보가 저장되는 곳.메소드 정보에는 매개변수, 지역 변수, 복귀 주소 등이 있다. (LIFO)
  • 힙 영역 : JVM의 실행 데이터 영역 중에서 가장 중요한 역할을 담당. 동적으로 객체가 생성되고 소멸되는 곳이며 저장하는 곳 3개의 영역으로 구분(Young, Old, Permanent)
  • 레지스터 영역 : 현재 JVM이 수행할 명령어의 주소를 저장하는 메모리 공간. 개발자는 신경쓸 필요가 없다.
  • 네이티브 메소드 스택 영역 : 네이티브 메소드는 OS의 시스템 정보, 리소스 정보를 사용하기 위해 C, C++로 작성할 필요가 있다. 이 영역은 네이티브 메소드에서 사용하는 매개변수나 지역 변수 등 네이티브 메소드에 대한 정보가 저장된다. JNI(Java Native Interface) API를 사용하면 자바 프로그램에서 OS에 대한 시스템 접근이 가능하다.
  • Young Generation : 프로그램 내부에서 어떤 코드를 실행할 때 새롭게 생긴 데이터가 저장되는 부분이고, Young 영역에 계속 데이터가 유지되면 Old영역으로 이동하게 된다. 이 영영은 Eden, Servivor1, Servivor2 영역으로 나뉜다. 새로운 객체는 Eden영역에 생기고, GC(Garbage Collector)가 실행될 때 Edend에서 계속 사용될 데이터를 Survivor1으로 옮긴다. 또 새로운 객체가 생성되면 Eden에 유지가 되고 GC가 발생하면 이번엔 Survivor2로 옮기고 이번엔 Survivor1에  계속 유지될 데이터도 함께 이동한다. 그다음 GC가 발생하면 Survivor2에서 Survivor1으로 이동하고 계속 왔다 갔다 반복하게 되고, 여기서 일정 시간 계속 유지되는 데이터는 Old영역으로 이동시키게 된다. (Survivor1과 Survivor2는 동등 관계) - Young 영역에서 발생하는 GC를 minor GC라고 하며 빈번하게 발생한다.
  • Old 영역 : Old 영역은 Young 영역과 비교했을 때 오랫동안 데이터가 유지된다. Old 영역에서도 데이터를 유지하다 GC가 발생되면 더이상 사용하지 않을 데이터 (참조를 잃은 데이터)를 제거하게 된다. Old 영역에서 발생하는 GC는 상대적으로 빈번하게 발생하고 Major GC라한다.
  • Permanent 영역 : 클래스들의 정보가 저장되는 영역으로 JVM에서 클래스 정보를 바탕으로 메모리 위에 객체를 빠르게 생성하기 위해 저장하는 곳. GC가 발생하는 동안 STW(Stop The World)가 발생한다. STW는 GC가 실행되는 동안 JVM의 다른 기능들이 잠시 멈추는 것을 의미한다.


동적로딩 : 프로그램을 실행하는 도중에 새로운 클래스를 로딩할 수 있음.

- 로드 타임 동적 로딩 : 프로그램 실행 초기에 클래스를 로딩하는 것

- 런타임 동적 로딩 : 프로그램 실행 중간에도 클래스를 로딩하는 것

Comments