Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 프레디케이트
- 생각
- JPA
- 스프링구성
- 동작파라미터화
- 영속성
- 영속성컨텍스트
- 엔티티매핑
- 일빵빵알파벳파닉스
- 메서드참조
- spring5receipe
- 스프링5레시피
- 잡담
- 일급함수
- spring configuration
- ES6
- 다시보기연습
- 나만재밌는이야기
- Java8
- 객체지향생활체조원칙
- 제대로알기
- 1월의독서
- 람다
- a-d
- 모던자바인액션
- 발음공부
- 클린코드
- 달리기를말할때내가하고싶은이야기
- es5
- gulp
Archives
- Today
- Total
notepad
JVM 이해하기 본문
https://www.inflearn.com/course/the-java-code-manipulation
JDK, JVM, JRE
JVM - 자바가상머신, 컴파일된 자바 바이트코드를 OS에 특화된 코드로 변환하여 실행한다.
클래스를 읽고, 메모리에 올리고, 실행하고. JVM 자체는 플랫폼에 종속적이다.
JRE = JVM + Library : 실행에 필요한 것만 포함되어있다
JDK = JRE + devtools
Java11 부터는 JDK만 제공한다
JVM 구조
(크게 4영역)
- 클래스 로더 시스템
- 메모리
- 실행엔진
- 네이티브 메소드 인터페이스(JNI), 네이티브 메소드 라이브러리
클래스 로더 시스템(3영역)
바이트코드를 읽고 메모리에 저장
- 로딩 : 클래스를 읽어오는 과정
- 링크 : 레퍼런스를 연결하는 과정
- 초기화 : static 값들 초기화 및 변수에 할당
메모리(5영역)
- 모든 영역에 공유 : 메소드, 힙
- 스레드에서 공유 : 스택, PC, 네이티브 메소드 스택
- 메소드 : 클래스 수준(클래스명, 부모클래스명, 변수) 의 정보를 저장, 공유 자원이다.
- 힙 : 실제 인스턴스 저장. 공유자원이다
- 스택: 쓰레드마다 런타임 스택을 만들고, 그 안에 메소드 호출을 스택 프레임이라 부르는 블럭으로 쌓는다. 쓰레드를 종료하면 런타임 스택도 사라진다.
- PC 레지스터 : 현재 실행할 스택 프레임을 가리키는 포인터
- 네이티브 메서드 스택 : JNI를 통해 네이티브 메서드 라이브러리를 사용하기 위한 정보가 저장된다.
- public static native Thread currentThread(); | c나 c++ 같은 네이티브 언어로 작성된 코드, native 키워드가 붙는다
실행엔진
- 인터프리터, JIT 컴파일러, GC
- 바이트코드를 인터프리터가 읽어서 네이티브 코드로 변환하여 실행한다
- JIT 컴파일러 : 바이트코드를 네이티브 코드로 컴파일, 인터프리터 효율을 높이기 위해 인터프리터가 반복되는 코드를 발견하면 JIT컴파일러로 반복되는 코드를 모두 네이티브 코드로 바꿔준다. 그 다음부터 인터프리터는 네이티브 코드로 컴파일된 코드를 바로 사용한다.
- GC : 더이상 참조되지 않는 객체를 모아서 정리한다.
- StopTheWorld - GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것
- 힙 메모리를 대상으로 일어난다. 새로운 객체는 Eden영역에 할당된다.
결론 : 클래스로더가 읽어서 적절히 메모리에 적재 후 실행엔진이 실행.
클래스로더 시스템 상세
클래스 로더 시스템(3영역)
바이트코드를 읽고 메모리에 저장
1. 로딩 : 클래스를 읽어오는 과정
2. 링크 : 레퍼런스를 연결하는 과정
3. 초기화 : static 값들 초기화 및 변수에 할당
- 로딩 : bootstrap -> Platform(Extension) -> Application 클래스로더 | 부모로부터 클래스 검색을 하고, 자신까지 못 찾으면 ClassNotFountException 이 발생한다.
- 클래스 로더가 클래스 파일을 읽고 그 내용에 따라 적절한 바이너리 데이터를 만들어 “메소드(클래스정보저장)” 영역에 저장
- 메소드 영역에 저장되는 데이터 : FQCN(풀패키지경로), class, interface, enum, method, variable
- 로딩이 끝나면 해당 클래스 타입의 객체를 생성하여 “힙”에 저장
- 링크(3단계) :
-> verify (검증, 클래스파일이 유효한지 검증)
-> prepare 메모리를 준비하는 과정 (클래스변수와 기본값에 필요한 메모리)
-> resolve(optional) - 메서드 참조 시, 심볼릭 메모리 레퍼런스를(링크 단계에서는 논리적 레퍼런스. 실제로 객체를 가리키고 있지 않다) 힙에 있는 실제 레퍼런스로 교체한다.
- 초기화
-> 준비된 메모리에 스태틱 변수의 값을 할당한다. | 스테틱 블럭이 있다면 이 때 실행
'JAVA > JAVA' 카테고리의 다른 글
[레시피2] 스프링코어 - POJO와 IOC컨테이너를 다루는 기술 (0) | 2021.03.10 |
---|---|
리플렉션 (0) | 2020.09.04 |
Generics - 제네릭 사용 이유 (0) | 2020.05.27 |