우선 JVM이란 자바를 실행시키기 위한 가상 컴퓨팅 환경이다.
이전에 배울때에는 OS역할을 한다고 해서 OS위에 JVM이 하나 더올라가는 것으로 이해했었다.
하지만 이번에 JVM을 공부하면서 알게 된것은
자바 어플리케이션을 실행하게 되면 JVM이 하나의 프로세스로 돌아가게 되고
GC나 여러 기능들이 스레드로 동작하게 된다.
우선 우리가 JAVA 소스코드를 작성하고 javac와 같이 자바 컴파일러로 컴파일하게 되면
class파일이 생성된다.
이 class파일을 JVM이 Class Loader를 통해 클래스 파일을 읽어 들인다.
이 클래스 파일안에 어떤 필드가 몇개고, 메소드가 몇개인지 바이트코드 까지 포함하여 클래스에 대한 모든 정보가 들어있다.
이 클래스 파 일 정보를 Method Area에 올려 검증하고 static변수들을 초기화 합니다.
그중 바이트 코드를 Interpreter에게 주어 바이트코드를 기계화로 번역하게 한다.
Runtime Area는 JVM의 메소드와 같은 영역으로서 5가지 영역이 있다.
1. 그중 Method Area는 클래스에 대한 정보가 저장된다.
2. Heap은 런타임에 생성되는 모든 객체들이 저장된다.
GC(Garbage Collector)가 Heap에서 활동
Methoed Area와 Heap은 모든 스레드가 공유하는 영역
3. JVM Stacks는 메서드를 실행하기 위한 정보들이 저장되는 공간
Frame이라는 자료구조가 저장됨
Frame내부에는 3가지 구성요소가 있다.
- Constant Pool 에 대한 참조
- Local Varialbe Array 지역변수 배열
- Operand Stack
이 있다. 지역 변수에는 해당 함수의 지역변수들이 들어 있는데
0부터 n까지의 인덱스에서 1부터 지역변수들이 들어가게 된다.
이때 0자리에는 this가 들어가게 된다!!!
그래서 우리가 호출할때 this를 썼던 것이었다....
그리고 Operrand Stack은 JVM이 Stack을 기반으로 연산을 수행하기 때문에
c = a + b
를 하게 된다면
Local Variables의 1번 자리에 있는 a를 스택에 올리고 2번자리에 있는 b를 스택에 올린뒤 두개를 더하고
해당값을 스택에서 꺼내어 c주소에 저장하는 방식이다.
PC Registers는 현재 실행되고 있는 명령어의 주소를 저장하는 것이다.
멀티스레드로 잠시 CPU 점유를 넘겨주고 다시 돌아왔을때 이전에 어떤 명령을 수행 하고 잇었는지 저장
Native Method Stacks는 C나 C++로 저장된 메서드를 실행할때 사용되는 Stack이다.
JVM stacks, PC Registers , Native Method Stacks 3가지는 thread가 생성될때마다 같이 생성되고
서로다른 스레드가 침범 할 수 없는 영역이다.
각 스레드는 하나의 힙고 메소드 Area에 동시에 접근 할 수 있다.
하지만 스레드끼리는 다른 스레드 내부에 접근 할 수 없다.
이때문에 지역변수 동시성 문제를 생각하지 않아도 된다.
실행 flow를 보면
class파일에서
자바가 클래스 패스를 탐색하면서 .class파일을 읽어온다.
그뒤 해당 클래스 정보를 메소드 영역에 올라간다.
JVM이 메서드영역의 바이트 코드를 해석하는데
처음에는 main안에 다른 클래스들은 상수풀에 올라가있지 않다가 필요할때 동적으로 클래스 정보를 로드한다.
그래서 main안에 Person person = new Person();
이 있다면 new라는 것을 인식하고 상수풀에서 Person이 저장된 상수풀을 지정해준다 그럼 그것을 보고 메모리를 할당 해준다.
만약 Person클래스가 Method영역에 로드 되지 않았다면 클래스 로더에게 요청을 보내 해당 클래스를 메모리에 로드하도록 한다.
이렇게 만들어진 Symbolic Reference를 Person 클래스 데이터를 직접 가리키는 참조로 바꾸는데 이를 Constant Pool Resolution이라고 부른다.
Heap의 공간이 얼마나 필요한지 알기 위해 상수 풀을 보고 필요한 메모리를 결정한다.
'Java' 카테고리의 다른 글
CS 스터디 회고 - 운영체제 1 (0) | 2024.12.01 |
---|---|
Java 면접(인터뷰) 스터디 회고 3 (0) | 2024.11.21 |
CS 스터디 회고 - java 2 (0) | 2024.11.15 |
[CS 스터디 회고] JAVA 면접 질문 대비 (1) | 2024.11.08 |
Java priority queue (0) | 2023.09.30 |