| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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
- Reflection
- 문자열
- 백준
- redis
- BOJ
- 스프링
- MST
- 약수
- spring security
- 객체지향
- test
- 자바
- 모던자바
- 리플렉션
- 다이나믹 프록시
- Deadlock
- java
- 운영체제
- Python
- 모던 자바 인 액션
- 알고리즘
- OS
- 스프링 시큐리티
- CS
- 파이썬
- 프록시
- proxy
- Spring
- 최소 신장 트리
- Junit5
Archives
- Today
- Total
Dev 달팽이 @_''
Java - JVM 구조 본문
Java - JVM 구조

클래스 로더 시스템
- .class 에서 바이트코드를 읽고 메모리에 저장
- 로딩 : 클래스 읽어오는 과정
- 링크 : 레퍼런스를 연결하는 과정
- 초기화 : static 값들 초기화 및 변수에 할당
메모리
- 메소드 영역에는 클래스 수준의 정보(클래스 이름, 부모 클래스 이름, 메소드, 변수) 저장
- 힙 영역에는 객체를 저장
- 메소드 영역과 힙 영역은 공유 자원이다.
- 스택 영역에서는 쓰레드 마다 런타임 스택을 만들고, 그 안에 메소드 호출을 스택 프레임이라 부르는 블럭으로 쌓는다. 쓰레드를 종료하면 런타임 스택도 사라진다.
- PC(Program Counter) 레지스터 : 쓰레드마다 쓰레드 내 현재 실행할 instruction의 위치를 가리키는 포인터가 생성된다.
- 네이티브 메소드 스택 : 네이티브 메소드 스택을 쌓는다.
- 스택 영역과 PC, 네이티브 메소드 스택은 쓰레드마다 생성된다.
실행 엔진
- 인터프리터 : 바이트코드를 한줄 씩 실행
- JIT 컴파일러 : 인터프리터 효율을 높이기 위해, 인터프리터가 반복되는 코드를 발견하면 JIT 컴파일러로 반복되는 코드를 모두 네이티브 코드로 바꿔둔다. 그 다음부터 인터프리터는 네이티브 코드로 컴파일된 코드를 바로 사용한다.
- GC(Garbage Collector) : 더이상 참조되지 않은 객체를 모아서 정리한다.
JNI(Java Native Interface)
- 자바 애플리케이션에서 C, C++, 어셈블리로 작성된 함수를 사용할 수 있는 방법 제공
- Native 키워드를 사용한 메소드 호출
네이티브 메소드 라이브러리
- C, C++로 작성 된 라이브러리
정리
클래스 로더 시스템에서 클래스를 로딩하고 링크를 통하여 레퍼런스를 연결, static 값들을 초기화 및 변수에 할당 -> 메모리에서 메소드와 힙 영역에 적절히 배치하고 실행 중 쓰레드가 만들어지면 쓰레드 스택, PC register, 네이티브 메소드 스택이 만들어짐 -> 실행 엔진이 바이트 코드를 한줄 씩 실행하고 효율적으로 실행하기 위하여 JIT 컴파일러를 쓰고, 메모리 최적화를 위하여 GC가 참조하고 있지 않은 객체들을 정리해줌 -> 메모리나 실행 엔진이 네이티브 메소드를 사용하면 JNI를 통하여 사용한다.
'Java&Spring > 더 자바, 코드를 조작하는 다양한 방법' 카테고리의 다른 글
| Java - 리플렉션 API(클래스 정보 조회) (0) | 2022.01.09 |
|---|---|
| Java - 바이트코드 조작 (0) | 2022.01.09 |
| Java - 코드 커버리지 (0) | 2022.01.07 |
| Java - 클래스 로더 (0) | 2022.01.07 |
| Java- JVM, JDK, JRE (0) | 2022.01.06 |