- jvm이란
- 자바 가상머신으로 자바 바이트 트 코드를 실행할 수 있는 주체다.
- cpu나 운영체제(플랫폼)의 종류와 무관하게 실행이 가능하다.
- 즉, 운영체제 에서 동작하는 프로세스로 자바 코드를 컴파일해서 얻은 바이트 코드를 해당 운영체제가 이해할 수 있는 기계어로 실행시켜주는 역학을 한다.
- JVM 구성( Class Loader, Execution Engine, Garbage Collector, Runtime Data Area) 로 나뉜다.
- 1. Class Loader
- 자바에서 소스를 작성하면 person.java 파일이 생성된다.
- .java 소스를 자바 컴파일러가 컴파일하면 person.classs 같은 .class(바이트 코드)가 생성된다.
- 이렇게 생성된 클래스파일들을 어서 JVM이 운영체제로부터 할당 받은 메모리인 Runtime Data Area로 적재하는 역할을 Class Loader가 한다. (자바 애플리케이션이 실행중일떄 이런작업을 수행한다.)
- 2. Execution Engine
- Class Loader에 의해 메모리에 적재된 클래스(바이트 코드)들을 기계어로 변경해 명어 단위로 실행하는 역할을 한다.
- 명령어를 하나 하나 실행하는 인터프리터(Interpreter)방식이 있고 Jit(Just-In-Time) 컴파일러를 이용하는 방식이 있다.
- Jit파일러는 적절한 시간에 전체 바이트 코드를 네이티브 코드로 변경해서 Execution Engine이 네이티브로 컴파일된 코드를 실행하는 것으로 성능을 높인다.
- 3. Garbage Collector
- GC는 Heap 메모리 영역에 생성(적재)된 객체들 중에 참조한 객체를 제외한 객체를 탐색한 후 제거하는 역할을 한다.
- GC의 동작 시간은 정확히 언제인지 알수 없다. (OS 메모리 상태, Thread 우선순위 등등) , GC가 수행되는 쓰레드를 제외한 다른 쓰레드는 모두가 일시 정지된다.
- 특히 Full GC가 일어나서 수 초간 든 쓰레드가 정지한다면 장애로 이어질 수 있다.
- 4. Runtime Data Area
- JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터를 적재하는 영역이다.
- 이 영역은 크게 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack으로 구성되어 있다.
- 1. Method area (메소드 영역)
- 클래스 멤버 변수의 이름, 데이터 타입, 접근 제어자 정보같은 필드 정보와 메소드의 이름, 리턴타입, 파라미터, 접근제어자 정보같은 메소드 정보, Type정보(interface인지 class인지), Constant Pool (상수 풀: 문자 상수, 타입, 필드, 객체 참조가 저장됨), static 변수, final 변수 등이 생성되는 영역이다.
- 클래스 멤버 변수의 이름, 데이터 타입, 접근 제어자 정보같은 필드 정보와 메소드의 이름, 리턴타입, 파라미터, 접근제어자 정보같은 메소드 정보, Type정보(interface인지 class인지), Constant Pool (상수 풀: 문자 상수, 타입, 필드, 객체 참조가 저장됨), static 변수, final 변수 등이 생성되는 영역이다.
- 2. Heap area(힙 영역)
- new 키워드로 생성는 객체와 배열이 생성되는 영역이다.
- 메소드 영역에 로드된 클래스만이 생성 가능하고 GC가 참조하지 않는 메모리를 확인하고 제거하는 영역이다.
- 3. Stack area(스택 영역)
- 지역변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값등이 생성되는 영역이다.
- int a =10; 이라는 소스를 작성했다면 정수값이 할당될 수 있는 메모리공간을 잡아두고 그 메모리영역에 10이 들어간다. 즉 스택 메모리에 이름이 a라고 붙여주고 값이 10인 메모리 공간을 만든다.
- 클래스 Person p = new Person(); 이라는 소스를 작성했다면 Person p는 스택 영역에 생성되고 new로 생성된 Person 클래스의 인스턴스는 힙 영역에 생성된다.
- 그리고 스택영역에 생성된 p의 값으로 힙 영역의 주소값을 가지고 있다. 즉, 스택 영역에 생성된 p가 힙 영역에 생성된 객체를 가리키고(참조하고) 있는 것이다.메소드를 호출할 때마다 개별적으로 스택이 생성된다.
- 4. PC Register (PC 레지스터)
- Thread(쓰레드)가 생성될 떄마다 생성되는 영역으로 Program Counter 즉, 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역이다 (*cpu 레지스터와 다름) 이것을 이용해서 쓰레드를 돌아가면서 수행할 수 있게 된다.
- Thread(쓰레드)가 생성될 떄마다 생성되는 영역으로 Program Counter 즉, 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역이다 (*cpu 레지스터와 다름) 이것을 이용해서 쓰레드를 돌아가면서 수행할 수 있게 된다.
- 5. Native method stack
- 자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역이다.
- 보통 c/c++ 등의 코드를 수행하기 위한 스택이다. (JNI)
- 쓰레드가 생성되었을떄 기준으로 1,2번인 메소드 영역과 힙 영역을 모든 쓰레드가공유하고, 3,4,5번인 스택 영역과 PC레지스터, Natvie method stack은 각각 쓰레드마다 생성되고 공유되지 않는다.
'JAVA' 카테고리의 다른 글
빌드 도구, Maven 이란? (0) | 2020.08.08 |
---|---|
GC(Garbage Collector)이란? (0) | 2020.08.07 |
Jit 컴파일러란? 최적화 튜닝에 대해서 (0) | 2020.08.07 |
Java 어노테이션 (annotation) 이란? (0) | 2020.08.07 |
객체지향 5원칙 SOLID 이란? (0) | 2020.07.09 |