JAVA, JVM
JVM : 자바 가상 머신
- 자바(byte 코드)를 실행하기 위한 기계
특징 - OS에 독립
- JAVA는 JVM만 있으면 OS에 관계없이 프로그램 실행 가능하다.
- JVM이 OS에게 메모리 사용권한을 할당받고 JVM이 프로그램을 호출하여 실행한다.
- JAVA는 OS에 독립적이지만 JVM은 종속적이다
- C언어는 OS에 독립X
자바 메모리 구조
- Java source : 자바 코드(ex. Hello.java)
- Java 컴파일러 : 자바 코드 -> 바이트 코드로 변환 _ Class Loader : Class 파일을 메모리 (Runtime Data Area)에 적재 _ Execution Engine : 바이트 코드를 해석
- Runtime Data Area : 프로그램 수행하기 위해 OS에서 할당 받은 메모리 공간
Runtime Data Area
- 할당 받은 메모리 공간
Method Area
- JVM의 모든 쓰레드들이 공유하는 데이터 영역
- (= Class Area, Code Area, Static Area)
- Field Information : 멤버변수 의 이름, 데이터 타입, 접근 제어자에 대한 정보
- Method Information : 메서드 의 이름, 리턴타입, 매개변수, 접근제어자에 대한 정보
Heap
- new 연산자로 생성된 객체와 배열 저장하는 공간
- Garbage Collection, GC 으로 관리되는 영역
- Method Area에 로드된 클래스만 생성가능
Perm 영역
- JDK 8부터 Permanent Heap 영역이 제거되었다.
- 대신 Metaspace 영역이 추가되었다.
- Perm은 JVM에 의해 크기가 강제되던 영역이다.
- Metaspace는 Native memory 영역으로, OS가 자동으로 크기를 조절한다.
- 옵션으로 Metaspace의 크기를 줄일 수도 있다.
- 그 결과 기존과 비교해 큰 메모리 영역을 사용할 수 있게 되었다.
- Perm 영역 크기로 인한 java.lang.OutOfMemoryError를 더 보기 힘들어진다
- 저장 정보 : Class의 Meta 정보, Method의 Meta 정보, Static 변수와 상수 정보들이 저장 -> java8 ( Static Object는 Heap 영역으로 옮겨져서 GC의 대상)
Stack
- Last In First Out
- 메서드 호출시마다 각각의 스택 프레임이 생성, 메서드 수행이 끝나면 프레임별로 삭제
- 호출된 메서드의 매개변수, 지역변수, 리턴 값 및, 연산시 일어나는 값들 등 임시 데이터 저장
- 쓰레드 별로 별도의 스택을 생성하고 관리
- 스레드가 필요한 데이터를 저장하기 위해 프레임이라는 영역을 가진다
Native Method Stack
- 자바 외에 다른 언어에 제공되는 메서들이 저장되는 공간 (자바 프로그램이 컴파일되어 생성되는 바이트 코드 x , 실제 수행 할 수 있는 기계어로 작성된 프로그램을 실행 시키는 영역)
PC Register
- 다음 실행될 명령어가 있는 주소 저장