[CS 정리] JVM Stack & Heap

June·2021년 5월 29일
0

[CS] CS 지식 정리

목록 보기
12/27

어썸오 테코톡

https://www.youtube.com/watch?v=GU254H0N93Y&t=6s&ab_channel=%EC%9A%B0%EC%95%84%ED%95%9CTech

JVM의 구조

자바 소스 코드를 작성하고 자바 컴파일러로 컴파일하면 자바 클래스 파일이 생성된다. 자바 명령어로 해당 클래스 파일을 실행하면 JVM은 클래스 로더를 통해 클래스 파일을 읽어들인다.

이 클래스 파일 안에는 어떤 필드가 몇개 선언되어있는지, 메서드에 관한 정보, 바이트까지 포함해서 클래스에 관한 모든 정보가 들어있다.

Class Loader System은 클래스 파일을 메모리에 올리고 검증하고 스태틱 변수를 초기화하는 등 역할을 한다. 클래스 로더 시스템은 클래스 파일을 method area에 올린다.

Runtime Data Area는 JVM이라는 가상 머신이 사용하는 메모리 공간이라 생각하면 된다.

클래스 파일에는 바이트 코드도 있는데, 바이트코드는 JVM이 알아들을 수 있는 명령어 집합이다. JVM의 목적은 바이트코드를 기계어로 번역해서 CPU에게 일을 시키는 것이다. 바이트코드를 기계어로 번역하는 것을 인터프리터가 수행한다.

런타임 데이터 영역

Method Area

클래스에 대한 정보가 저장되는 공간.

Heap

런타임에 생성되는 모든 객체가 저장되는 공간. GC가 주로 여기서 동작

Method Area와 Heap은 모든 스레드가 공유하는 공간이다. 따라서 멀티스레드 환경에서 동기화에 주의해야 한다.

JVM Stacks

메서드를 실행하기 위한 정보들이 저장된다. 내부에는 Frame이라는 자료구조를 사용하는데 메서드가 호출되면 하나 생기고, 끝나거나 예외가 터지면 사라진다.

프레임안에는 현재 클래스의 constant pool에 대한 참조, 지역변수 배열, operand stack이 있다.

지역변수 배열은 말 그대로 메서드 내의 지역변수에 대한 정보를 담고 있다.
인덱스로 빠르게 접근이 가능하다.
인스턴스 메서드는 항상 첫 번째 인덱스에 현재 인스턴스에 대한 참조를 가지고 있다.

Constant Pool

Wooteco.class 파일을 javap 명령어로 역어셈블링한거다.

PC Registers

현재 실행되고 있는 명령어의 주소를 저장하고 있는 곳. 멀티스레드 환경에서 한 스레드가 작업을 하다가 다른 스레드에게 넘겨줬을 때 이전에 어떤 명령을 실행했는지 기억하기 위한 공간이다.

Native Method Stacks

C나 C++로 작성된 메서드를 실행할 때 사용되는 스택

JVM Stacks, PC Registers, Native Method Stacks는 스레드가 생성될 때마다 생성된다. 서로 다른 스레드가 침범할 수 없다.

무민의 테코톡

[10분 테코톡] 🎅무민의 JVM Stack & Heap

문제

크로스 컴파일

JVM으로 문제를 해결

굳이?

자바의 야심

자바스크립트가 현재 이렇게 동작한다.

자바 코드가 실행되기까지

프론트는 javac가 해주고 백은 jvm이 해준다. C/C++은 한번에 이 과정을 처리한다. 이렇게 두 단계로 나뉘어져 있기 때문에, 런타임에서 발생하는 소중한 정보를 이용할 수 있다. 그 정보로 최적화를 하는 것이 JIT Compiler이다.

JVM 내부 구조

Method Area

method area는 클래스 로더가 클래스 파일을 읽어서 정보를 파싱해서 저자하는 공간이다.

Heap

Per Thread

Program Counter

Stack

빨간색 부분에서 제일 위 스택 프레임은 메인 메서드이고, 그 밑에 것은 메인 메서드에서 호출한 메서드...

Stack Frame

Native Method Stack

자바 코드 예시

컴파일된 자바 바이트 코드

Local Variable Array

Operand Stack

Program Counter

내가 실행할 바이트코드가 아더인지

0개의 댓글