2020. 8. 3. 10:05ㆍStudy
특징
- Java가 OS에 종속되지 않고 프로그램을 실행할 수 있도록 합니다. (JVM은 OS에 종속됩니다.)
- JVM은 JRE(Java Runtime Environment)에 포함되어 있습니다.
- JVM은 스택을 기반으로 하는 가상머신입니다.
역할
- Java와 OS 사이에서 중계자 역할을합니다.
- Java Application을 Class Loader를 통해서 읽어 들이고 Java API와 함께 실행합니다.
- 메모리와 Garbage Collector를 관리합니다.
JAVA 프로그램 실행 과정과 JVM의 메모리 구조
프로그램 실행 -> JVM이 OS에게 메모리 할당 요청 -> JVM은 할당 받은 메모리를 용도에 따라 나누어 관리합니다.
- JAVA source : 개발자가 작성한 Java code
- JAVA 컴파일러 : Java code를 Byte code로 변환시켜 줍니다.
- Class 파일 : Java 파일을 Java 컴파일러를 통해서 Byte code로 변환한 Byte code 파일입니다.
- Class Loader : .class 파일을 메모리(Runtime Data Area)에 적재하는 기능
- Execution Engine : Byte Code를 실행 가능하게 해석해주는 기능
- Runtime Data Area : 프로그램을 수행하기 위해 OS에서 할당 받은 메모리 공간
Runtime Data Area
1. Class Area
Method Area, Code Area, Static Area로 불립니다.
- 클래스 정보 : 멤버변수의 이름, 데이터 타입, 접근 제어자 정보
- 메소드 정보 : 메서드의 이름, 리턴타입, 매개변수, 접근제어자 정보
- 변수 정보 : Type이 Class인지 Interface인지 여부를 저장합니다.
Type의 전체 이름(package name + class name)
Type의 Super class의 전체 이름(Type이 interface, Object class인 경우는 제외)
접근 제어자 및 연관된 Interface의 전체 리스트 정보 저장
- 상수 Pool : Type에서 사용된 상수를 저장(중복값인 경우 기존 상수를 사용)
문자 상수, 타입, 필드, 메서드의 symbolic refrence(객체 이름으로 참조) 도 상수 풀에 저장
- Class Variable : Static 변수라고 불림
모든 객체가 공유하며 인스턴스화 없이 사용 가능
- Class 사용 이전에 메모리 할당 : final class 변수의 경우 (상수로 치환됩니다) 상수 풀에 값을 복사
2. Stack Area
- Last In First Out (LIFO) 후입선출(마지막으로 넣은 것이 가장 먼저 나옵니다)
- 메서드 호출 시마다 각각의 스택프레임(그 메서드만을 위한 공간)이 생성
- 메서드 안에서 사용되어지는 값들 저장, 호출된 메서드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 임시 저장
- 메서드 수행이 끝나면 스택프레임별로 삭제
3. Heap Area
new 연산자로 생성된 객체와 배열을 저장하는 공간이며, 클래스 영역에 로드된 클래스만 생성이 가능합니다.
Garbage Collector를 통해 메모리를 반환합니다.
- Permanent Generation : 생성된 객체들의 정보의 주소 값이 저장된 공간
- New Area : Eden : 객체들이 최초로 생성되는 공간
Survivor : Eden에서 참조되는 객체들이 저장되는 공간
- Old Area : New Area에서 일정시간이상 참조되고 있는 객체들이 저장되는 공간
4. Native method stack area
- 자바 외의 다른 언어에서 제공되는 메서드들이 저장되는 공간
5. PC Register
- Thread가 생성 될 때마다 생성되는 공간
- Thread가 어떤 부분을 어떤 명령으로 실행할 지에 대한 기록
- 현재 실행되는 부분의 명령과 주소를 저장
6. Garbage Collection
- 참조되지 않은 객체들을 탐색 후 삭제
- 삭제된 객체의 메모리를 반환
- Heap 메모리의 재사용
Minor Garbage Collection
- New 영역에서 일어나는 Garbage Collection
- Eden영역에 객체가 가득 차게 되면 첫 번째 Garbage Collection 발생
- Survivor1 영역에 값 복사
- Survivor1 영역을 제외한 나머지 영역의 객체들을 삭제
- Eden영역과 Survivor1영역의 메모리가 기준치 이상일 경우, Eden 영역에 생성된
객체와 Survivor1영역에 있는 객체 중 참조되고 있는 객체가 있는지 검사
- 참조되고 있는 객체를 Survivor2 영역에 복사
- Surviver2 영역을 제외한 영역의 객체들을 삭제
- 일정시간이상 참조되고 있는 객체들을 Old영역으로 이동
- 반복
Major Garbage Collection (Full Garbage Collection)
- Old영역에 있는 모든 객체들을 검사
- 참조되지 않은 객체들을 한꺼번에 삭제
- Minor Garbage Collection에 비해 시간이 오래 걸리고 실행 중 프로세스가 정지
Garbage Collection과 Heap Area를 정리했던 글 https://hun-developer.tistory.com/7
출처: https://huelet.tistory.com/entry/JVM-메모리구조 [어떤공간]
위 글은 어떤공간님의 글을 참고하여 작성하였습니다 감사합니다.
'Study' 카테고리의 다른 글
오버헤드란 무엇일까? (0) | 2020.08.31 |
---|---|
Memory Leak이란 무엇일까? (0) | 2020.08.09 |
Boiler plate란 무엇일까? (0) | 2020.05.07 |
IoC와 DI란 무엇일까? (0) | 2020.05.06 |
POJO Class란 무엇일까? (0) | 2020.03.09 |