기술 관련 해서 묻는 질문들은 매번 보고 또 봐도 기억속에 잘 남겨두지 못하는 나를 위해
그때마다 상기할 수 있도록 이렇게 따로 정리해두면서 자주 읽어보는 것이
머리에 남겨 둘 수 있는 최선의 방법이라고 생각한다.
자바가상머신의 약자를 줄여 부르는 용어.
Stack(스택)기반의 가상머신.
역할은 자바애플리케이션을 클래서 로더를 통해 읽어들여 자바 api와 함께 실행.
또한, java와 OS(운영체제)사이에서 중개자 역할을 수행하며, 운영체제에 구애 받지 않고 재사용을 가능하게 해준다.
마지막으로 메모리관리, Garbage Collection(가비지 컬렉션)을 수행한다.
왜 JVM를 알아야 하는가? 한정된 메모리를 효율적으로 사용하여 최고의 성능을 내기 위해서.
바이트코드를 실제로 JVM내에서 기계가 실행할수 있는 형태로 변환.
java byte code란? 기계가 바로 수행할 수 있는 언어보다는 사람이 보기 편한 형태
클래스를 실행시키는 역할.
내부적으로 해당 메서드가 얼마나 자주 수행되는지 체크하고, 일정 정도를 넘을 때에만 컴파일 수행
인터프리터 방식 보완하기 위해 도입된 JIT 컴파일러.
인터프리터 방식으로 실행하다가 적절한 시점에 바이트코드 전체를 컴팡리하여 네이티브 코드로 변경, 이후에는 네이티브 코드로 직접실행.
네이티브코드는 캐시에 보관하기 때문에 한번 컴파일된 코드는 빠르게 수행.
Thread(쓰레드)가 시작될 떄 생성되며, 쓰레드마다 하나씩 존재.
쓰레드가 어떤 부분을 어떤 명령으로 실행해야할지 기록하는 부분.
현재수행중인 JVM명령의 주소를 갖는다.
실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역.
일반프로그램처럼 커널이 스택을 잡아 독자적으로 프로그램을 실행.
클래스 정보를 처음 메모리 공간에 올릴 때 초기화 되는 대상을 저장하기 위한 메모리 공간.
Runtime Constant Pool이라는 별도의 관리영역도 함께 존재.
Runtime Constant Pool: 상수 자료형을 저장하여 참조하고 중복을 막는 역할
올라가는 정보의 종류
종류 | 설명 |
---|---|
Field Infomation | 멤버변수의 이름, 데이터타입, 접근제어자에 대한 정보. |
Method Infomation | 메소드의 이름, 리턴타입, 매개변수, 접근제어자에 대한 정보. |
Type Infomation | class/interface 여부 저장. 타입속성, 전체이름, super class의 전체이름 (단, interface이거나 object인 경우 제외) |
permanent Generation: 생성된 주소값이 저장된 공간.
New / Young: Eden(객체들이 최초로 생성되는 공간), Survivor 0/1(Eden에서 참조되는 객체들이 저장되는 공간)
Old 영역: 일정시간 참조되고 있는 객체들이 저장되는 공간.
Eden영역에 객체가 가득차게 되면 첫번째 GC발생.
Eden영역값을 Survivor 1 영역에 복사하고 이 영역을 제외한 나머지 영역의 객체를 삭제.
Heap(힙 영역)에서 사용하지 않는 객체(인스턴스)들을 제거하는 작업
필요한 이유는 java는 개발자가 메모리를 직접 해제해줄 수 없는 언어이기에 객체를 사용하고 제거하는 기능이 필요하기 때문.
'stop-the-world': GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것.
Minor GC
발생 한다고 함.Major GC(Full GC)
발생 한다고 함.