• 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 변수 등이 생성되는 영역이다.

  •  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 레지스터와 다름) 이것을 이용해서 쓰레드를 돌아가면서 수행할 있게 된다.

  •  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

+ Recent posts