#15. 보기에 있는 키워드 중, 최소 4개 이상을 선택하여 각각의 키워드가 본인이 주로 사용하는 언어에서 어떻게 동작 하는지/어떤 특성을 갖고 있는지 설명해 주세요. (GC, Call Stack, Context, Memory Leak, Global/Local/Static Variable, Stack/Heap - Memory적 관점)
JVM은 Java Virtual Machine의 약자이며, Java 프로그램을 실행할 수 있도록 돕는다.
.java 파일을 컴파일할 때, Java 컴파일러에 의해 .class 파일 (byte-code)이 만들어지고, 여러 과정을 거쳐 실행된다.
Class Loader에 의해 JVM 메모리에 .class 파일이 로드되고, 이는 Execution Engine에 의해 실행된다.
Class Loader는 세 단계로 이루어진다.
Class loader가 .class 파일을 읽고, 그에 대응하는 바이너리 데이터를 만들고 JVM의 method area에 저장한다. 이후 JVM은 .class 파일을 나타내기 위해 heap memory에 클래스 타입의 객체를 만든다.
Verification, Preparation, Resolution을 수행한다.
해당 .class 파일이 올바른 컴파일러에 의해 정확히 만들어졌는지 확인한다.
JVM이 class 변수들에 메모리를 할당하고 메모리를 기본값으로 초기화한다.
Direct reference를 symbolic reference로 대체한다.
모든 static 변수들이 코드와 static block에서 정의된 값으로 결정되고, 이는 class의 상단부터 하단으로 실행된다.
모든 객체들의 정보가 저장되며 JVM에 단 하나만 존재한다.
클래스 이름, 메소드, 변수 등과 같은 클래스 레벨의 정보들이 저장된다. JVM에 단 하나만 존재한다.
스레드마다 JVM이 하나의 run-time stack을 생성하고, 이를 activation record 또는 stack frame라 한다. 메소드의 모든 지역 변수들이 대응하는 frame에 저장되고, 스레드가 끝나면 JVM이 run-time stack을 삭제한다.
스레드마다 native stack이 만들어지고 native method 정보를 저장한다.
스레드의 최근 실행 명령의 주소가 저장된다.
.class 파일을 실행한다. byte-code를 한 줄씩 읽으며 memory 영역의 데이터와 정보를 이용하며 명령어를 실행한다. 크게 3가지로 분류할 수 있다.
byte-code를 한 줄씩 해석하며 실행한다. 단, 한 method가 여러 번 호출되면, 매번 interpretation이 필요하다.
interpreter의 단점을 보완하기 위해 사용된다. 전체 byte-code를 컴파일해 native code로 바꾼다. 이로 인해 여러 번 method가 호출되어도 다시 interpretation을 하지 않아도 된다.
JVM에서 Java 프로그램이 실행되면서 객체들이 heap에 생성되고, 시간이 지나면 더 이상 필요없어진 객체들이 존재하게 된다. Garbage collector는 이러한 객체들을 찾고 메모리에서 지운다.
C/C++에서는 프로그래머가 객체의 생성과 제거에 관여하기 때문에 필요없는 객체를 제거하지 않다보면 메모리가 부족해져 OutOfMemoryErrors가 발생할 수 있다. 반면 Java는 Garbage collector가 해당 역할을 하기 때문에 프로그래머가 신경쓰지 않아도 된다. Garbage Collector는 unreachable objects(아무것도 참조하지 않는 객체)를 제거하여 heap 메모리를 비운다.
이러한 Garbage Collection은 heap 메모리의 참조되지 않은 객체들을 제거하기 때문에 메모리에 있어서 효율적이다. 또한 garbage collector에 의해 자동으로 되기 때문에 프로그래머가 신경을 쓰지 않아도 된다.
Native Method Libraries과 상호작용하며 실행에 필요한 native libraries를 제공하는 interface이다. 이로 인해 JVM이 C/C++ libraries를 호출할 수 있다.
참고 및 출처
1) https://www.geeksforgeeks.org/jvm-works-jvm-architecture/
2) https://www.geeksforgeeks.org/java-memory-management/
3) https://www.geeksforgeeks.org/garbage-collection-java/