"Java Virtual Machine(JVM)은 Java 프로그램을 실행하기 위한 가상 머신
JVM은 Java 소스 코드를 컴파일한 바이트코드를 해석하여 실행하며, 이 과정을 통해 Java 프로그램이 다양한 플랫폼에서 동일하게 실행될 수 있도록 한다. 그래서 OS에 종속 되지않고 플랫폼 독립성을 확보 할 수 있다.
자바 클래스 파일을 로드하고, 링크 및 초기화한다
동적으로 필요한 클래스를 로드하여 메모리에 적재한다
인터프리터(Interpreter) :
바이트코드를 실제 머신 코드로 변환하여 실행
JIT 컴파일러(Just-in-Time) :
바이트코드를 런타임에 최적화된 네이티브 코드(기계어)로 변환
가비지 컬렉터(Garbage Collector):
사용되지 않는 객체를 자동으로 제거하여 메모리를 회수
개발자가 메모리 관리에 신경 쓰지 않아도 되도록 도와준다
스택(Stack):
- 각 스레드마다 하나씩 존재, 메서드 호출 시 스택 프레임이 생성되어 메서드 호출과 관련된 지역 변수, 매개변수, 리턴 주소 등이 저장
- 프로그램 실행과정에서 임시로 할당되었다가 메소드를 빠져나가면, 바로 소멸되는 특성의 데이터를 저장하기 위한 영역
- 각 스레드는 자신만의 스택을 가지고 있으며, 다른 스레드와 공유되지 않는다.
스레드(thread) :프로세스(process) 내에서 실제로 작업을 수행하는 주체를 의미
모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행한다.
두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스(multi-threaded process)라고 한다.
메소드(Method Area):
- 모든 클래스 레벨의 데이터가 저장되는 영역, 클래스 구조, 메서드 정보, 필드 정보, 상수 풀, 정적변수 등이 포함
- JVM이 클래스를 로드할 때 이 영역에 클래스 정보를 저장
- 모든 스레드가 공유하는 영역
PC Registers:
- 각 스레드마다 하나씩 존재하며, 현재 실행 중인 명령의 주소를 저장
- 현재 실행 중인 명령을 추적
- 각 스레드는 자신만의 PC 레지스터를 가지고 있다
Native Method Stack:
- 네이티브 메서드의 호출을 지원
- 네이티브 메서드의 실행을 지원한다. 각 스레드는 자신만의 네이티브 메소드 스택을 가지고 있다.
바이트 코드 : 고수준 프로그래밍 언어로 작성된 소스 코드를 컴파일한 중간 단계의 코드
네이티브 코드 : 특정 하드웨어와 운영체제에서 직접 실행될 수 있는 기계어 코드
< static 과 nonstatic 멤버들의 메모리 접근방법 >
1. static 멤버들은 실행될때 자동으로 메모리에 로딩이 된다.
코드에서 보면 static void main ()은 static 메서드여서 프로그램이 실행될때 자동으로 method area에 할당이된다.
하지만 non static인 int hap() 는 자동으로 메모리에 할당이 되지 않기 때문에 객체를 생성하여 메모리에 로딩 시켜줘야한다.
그게 바로 코드에서 보면
NoneStaticTest st = new NoneStaticTest();
으로 객체를 생성해준다.
그렇게 되면 힙 영역에 객체가 생성되어 메모리 공간이 생긴다 이 힙 영역에 생긴 hap는
메서드영역에 의 hap()을 가르킨다.
int sum = st.hap(a, b);
그리고 st.hap()로 콜을 하게 되면 스택영역에 있는 main() 에서 st -> 힙영역 hap를 참조하게 된다.
그리고 System.out.println(sum);
으로 모든 main() 메서드의 코드 실행이 끝나면 스택 영역에서 제거된다
자동으로 메모리에서 제거된다는 뜻이다
하지만, 여기서 힙영역에는 여전히 데이커가 메모리에 상주하게 된다
여기서 가비지 컬렉터가 힙영역을 청소하게 된다.
힙영역을 쭉 살피고 참조되지 않고 남아버린 고아 객체들을 식별해 힙 영역을 청소해준다
그리고 코드 실행이 모두 끝나면, 메서드 영역도 비워지게 된다.
자바 소스 파일(.java)은 자바 컴파일러(javac)에 의해 바이트코드(.class)로 변환
JVM은 이 바이트코드를 읽고 실행
바이트코드는 플랫폼에 독립적인 중간 형태의 코드로, 다양한 운영체제에서 동일하게 실행될 수 있다
JVM은 메모리 할당과 가비지 컬렉션을 통해 메모리를 효율적으로 관리
JVM은 바이트코드를 검증하고 애플리케이션이 악의적이거나 잘못된 동작을 하지 않도록 보장 이자바 애플리케이션의 안정성과 보안성이 향상된다
한 번 작성된 자바 애플리케이션은 JVM이 설치된 모든 환경에서 실행될 수 있습니다.
참고 :
JVM이란? 개념 및 구조 (JDK, JRE, JIT, 가비지 콜렉터...)
그림으로 보는 자바 코드의 메모리 영역(스택 & 힙)