JVM 구조
JDK: Java Development kit으로 자바 프로그램 개발에 필요한 도구를 제공한다.
예) javac- 컴파일러, javap-클래스 파일(.class)을 소스코드 (.java)으로 디스어셈블해주는 도구,
java- javac가 만든 클래스파일을 해석하고 실행, java doc- 소스 코드의 주석을 자동으로 HTML문서로 만들어주는 도구 등등
JER: 실행시 필요한 API나 바이트 코드 등 필요한 구성요소를 결합한다. * JDK설치 시 자동으로 호환되는 JRE이 설치됨
JVM: OS와 독립적으로 프로그램을 실행/개발 할 수 있도록 도와주는 SW
1. JVM의 동작 과정 + JVM구조
.java 파일이 컴파일러(javac)를 통해 .class파일(바이트코드)로 변환.
실행파일이 JRE을 통해 여러 라이브러리 등 과 결합해 jvm으로 전달됨.
이 전달된 데이터를 클래스 로더가 받아서 JVM메모리영역에 적재시킴.
클래스 로더는 메모리에 한번에 다 로드하는게 아닌 필요한 것만 로드 시킴. (lazy loading)
(class파일은 jvm이 이해할 수 있는 코드로 기계어로 해석하는 인터프리터단계를 거친다.)
heap영역
- 객체가 저장됨.
- 스레드끼리 공유하는 영역
- GC이 heap에 있는 객체중에서 참조하는 참조변수가 없는 객체가 있으면 공간을 회수.
- Method영역에 로드된 클래스만 heap영역에 생성될 수 있음.
Method Area
- 클래스 정보를 저장
예) 멤버 필드/메소드, 필드 정보(리턴타입) 등등
- static, constant pool영역도 같이 생성됨.
- 코드는 new키워드를 생성하기 전까지는 그냥 텍스트에 불과
new키워드를 통해 객체 생성 후 메소드를 실행하면 클래스 코드에 대한 정보가 Method영역에 저장됨.
- 벤더마다 Method Area와 heap영역을 분리하지 않기도 함.
PC register
- 스레드가 생성될때마다 공간 생성되어 어떤 명령어를 수행할지 기록하는 영역
JVM는 Instruction는 cpu가 아닌 stack에 operand를 뽑아서 메모리공간에 저장함.
* Instruction의 구조
연산코드: 수행할 명령어 형식
오퍼랜드: 연산코드에 사용될 데이터나 데이터의 주소. 이런 데이터는 cpu레지스터 또는 기억장치에 위치한다.
Stack Area
- LIFO구조로 스레드가 생성될때마다 생성되며 별도로 가지고 있음.
- 메서드가 실행시 필요한 공간을 제공하며 메서드의 호출기록과 임시데이터(지역변수, 매개변수 등)이 저장됨.
- 메서드가 실행되면 프레임이 생성되어 JVM Stack에 pop(추가)됨.
- 이 스택 프레임의 내용으로는
1. Local variable: 지역변수
2. Operand stack: 계산을 하기위한 공간
3. Constanct Pool Reference: heap/Method영역의 객체 주소 참조
Native method stack
- 다른 언어로 작성한 코드를 위한 공간.
- JNI를 통해 호출되는 c/c++ 코드를 수행하기 위한 스택이다.
* JNI: JVM에서 c,c++, 어셈블리어 등 으로 구축한 네이티브 함수가 존재하는데 이 함수를 호출할 수 있도록 방법을
제공한 것.
스레드가 공유하는 영역: heap, Method Area
스레드 별 생성되는 영역: stack, PC register, Native method stack
Execution Engine
- 클래스 로더를 통해 JVM내 런타임 데이터 영역에 배치된 바이트 코드를 기계어로 변경함.
- 변경시 인터프리터, JIT사용
* 인터프리터: 바이트 코드 > 기계어
JIT: 반복되는 코드를 컴파일시켜 저장소에 저장해 인터프리터가 번역시 컴파일된 코드를 바로 사용할 수 있도록하는 것
참조사이트
https://joomn11.tistory.com/15
[JAVA] JVM 메모리 구조, 데이터 영역 ( Runtime Data Areas)
JVM의 구성요소 중, 데이터 영역에 대한 설명으로 아래의 내용들에 대해서 다루어 보도록 하겠다 Runtime Data Areas란 Runtime Data Areas의 구성 요소 스레드 별로 존재 PC Register JVM Stack Native Method..
joomn11.tistory.com
https://velog.io/@dev_isaac/JVM
JVM은 꼭 알아야 합니다...
경험있고 깊이있는 개발자라면 코드를 짤 때 어플리케이션의 성능과 안정성 등을 고려할 것이지만, 부끄럽게도 나는 어플리케이션의 성능과 안정성보다는 로직의 구현 자체에 더 신경을 써온
velog.io
https://doohong.github.io/2018/03/02/Java-runtime-data-area/
[JAVA]자바의 기본 개념 정리-2.자바 메모리 구조
Runtime Data Area JVM이 프로그램을 수행하기 위해 운영체제로부터 할당 받는 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역이다. 이 영역은 각각의 목젝에 따
doohong.github.io
https://steady-coding.tistory.com/305
JVM 메모리 구조란? (JAVA)
안녕하세요? 코딩 중독입니다. 오늘은 JVM 메모리 구조에 대해 알아보겠습니다. JVM이란? JVM 메모리 구조를 설명하기 전에 JVM이 무엇인지 알아야 합니다. JVM은 Java Virtual Machine의 약자로, 자바 가상
steady-coding.tistory.com
https://velog.io/@litien/JVM-%EA%B5%AC%EC%A1%B0
JVM 구조
JVM은 자바 가상머신으로 자바 바이트코드를 실행 할 수 있는 주체로 JVM 덕분에 CPU나 운영체제(플랫폼)과 독릭접으로 동작 가능하다JVM은 크게 Class Loader,GC, Runtime Data Area, Excute engine 세가지로 나
velog.io
