개발/SPRING & JPA

JVM 구조

Leedo1982 2021. 5. 30. 11:04

byte 코드는 jvm 같은 가상머신이 이해할 수 있는 코드 (.class)
binary 코드는 cpu가 이해할 수 있는 코드

jvm

클래스 로더

바이트 코드를 읽어 메모리에 적절히 배치하며, .class 를 읽어(로딩) 코드내부의 레퍼런스를 연결(링크)하고 클래스에 있는 static 값을 초기화(초기화) 한다.

loading

bootstrap classloader : jre/lib 의 기본 자바 api 라이브러리를 로드
extension classloader : jre/lib/ext 의 모든 확장 코어 클래스파일을 로드
application classloader : extension classloader 의 child 이며 시스템 클래스로드라고도 불린다. 사용자가 직접정의한 클래스들을 로드합니다.

Linking

verify : 자바 바이트 코드를 검증한다.
prepare : 모든 정적변수의 메모리가 할당되며 기본 default 값으로 할당(아직 초기화되지 않음)
resolve : 모든 심볼릭한 메모리 참조를 메소드 영역에 있는 타입으로 직접 참조

initialize

모든 정적 변수가 자바코드에 명시된 값으로 초기화되며 정저 블록이 실행됩니다.

jvm 메모리

메모리는 크게 전체 자원을 공유하는 method area, heap 와 쓰레드 단위의 자원을 공유하는 stack, pc, native method stacks 가 있다.

method area

모든 클래스 수준(클래스명, 부모클래스명, 메소드, 변수)의 데이터가 저장됩니다. JVM 당 하나의 영역밖에 존재하지 않습니다.

heap area

모든 인스턴스 오브젝트(클래스, 배열 등)이 저장되는 공간, jvm 당 하나의 영역밖에 존재하지 않는 공유자원 method area 와 같이 multi thread에서 접근이 가능하므로 스레드에 안전하지 않다.

stack area

스레드가 생겨날 때, 해당 스레드를 위한 stack 도 생성된다. 그 stack 에 프레임이 들어가며 프레임은 메소드가 호출될 때마다 만들어지며, 메소드 상태 정보를 저장한다.
스레드가 쓸수 있는 스택의 사이즈를 넘기면 stackoverflowerror 이 발생한다.
스택 사이즈를 동적으로 확장할 수도있는데, 확장할 메모리가 부족하거나 새로운 스레드를 만들때 필요한 새로운 스택에 할달할 메모리가 부족하면 outofmemoryError이 발생한다.

frame

frame 는 3가지로 구성되어 있다.

Local Variables : 메소드의 지역변수들을 같는다. primitive 타입은 값을 그냥 프레임에 저장한다. reference 는 heap 의 레퍼런스 이다. double, long 는 두칸을 차지한다.
Operand Stack : 메소드내 계산을 위한 작업공간이다.
Constant Pool Reference : 프레임은 런타임 상수 풀의 참조를 갖는다.

PC 레지스터

현재 실행중인 명령문의 주소를 가지기 위해 스레드 마다 개별 PC 레지서트가 존재한다.

native method stack

native 메소드 호출할때 사용하는 별도의 스택
네이티브 메소드는 C와 같은 언러로 구현된 메소드이다. (ex. Thread.currentThread())

실행엔진

인터프리터 : 바이트 코드를 빠르게 한줄씩 해석하지만 실행속도는 느리다.
JIT(just-in-time)컴파일러 : 인터프리턴의 단점을 보완. 실헹엔진은 바이크코드를 변환하는데에 인터프리터의 도움을 받지만 반복되는 코드가 발견되었을 시에는 jit컴파일러를 사용해 native code 로 컴파일한후 인터프리터의 변환과정업ㅅ이 직접 사용한다.
gc(garbage collector): 더이상 참조되지 않는 객체를 모아 메모리를 정리한다.

참조: 기계인간 JVM stack과 frame
참조2: JVM 메모리 구조 및 아키텍쳐(클래스 로더, 실행엔진 등)

추가로 GC 는 이글보다 자세한걸 못봤다

'개발 > SPRING & JPA' 카테고리의 다른 글

Process Vs Thread  (0) 2021.05.30
[Spring] bean lifecycle  (0) 2021.05.25
[토비] 8.4 스프링의 기술  (0) 2021.05.23
[Spring-Core] Bean Overview  (0) 2021.04.19
[Spring-Core] 1.2 Container Overview  (0) 2021.04.16