09 Jan 2020
Java 메모리 구조 (2)
Java 메모리 구조(2)
Stack
- 메소드 내에서 정의하는 기본 자료형(int, double, byte, long, boolean 등)에 해당되는 지역변수(매개 변수 및 블럭문 내 변수 포함)의 데이터의 값이 저장되는 공간
- 해당 메소드가 호출될 때 메모리에 할당되고 종료되면 메모리가 해제된다
- Last In First Out(LIFO) 방식으로, 메소드 호출 시마다 각각의 스택 프레임(해당 메소드 만을 위한 공간)이 생성
Heap
- new 연산자로 생성된 객체와 배열을 저장하는 공간으로 클래스 영역에 로드된 클래스만 생성 가능하다.
- Garbage Collector를 통해 메모리를 반환하게 된다.
- 기존 New / Survivor / Old / Permanent / Native 에서 New / Survivor / Old / Metaspace 로 변경.
- Permanent Generation 영역에 저장되어 문제를 유발하던 Static Object는 Heap 영역으로 옮겨서 최대한 GC 대상이 되도록 한다. (Static Final 인 경우는 제외)
-
수정될 필요가 없는 정보만 Metaspace에 저장, Metaspace는 JVM이 필요에 따라서 리사이징 할 수 있는 구조로 개선되었다.
- Permanent Generation
- 생성된 객체들의 정보의 주소 값이 저장된 공간
- New Generation
- Eden
- 객체들이 최초로 생성되는 공간
- Survivor
- Eden에서 참조되는 객체들이 저장되는 공간
- Eden
- Old Generation
- New Generation 에서 일정시간 이상 참조되고 있는 객체들이 저장되는 공간
PC Register
- Thread가 생성 될 때마다 생성되는 공간
- Thread가 어떤 부분을 어떤 명령으로 실행할 지에 대한 기록
- 현재 실행되고 있는 부분의 주소(Address)를 가지고 있다.
- 현재 실행되고 있는 명령이 종료되면 카운트 값을 증가시켜 다음 명령을 실행하게 한다.
Native Method Area
- 자바 외 언어(C, C++ 등)을 수행하기 위한 Stack 영역.
- 프로그램 실행 도중 호출 된 메서드가 Native 방식을 사용하는 메소드 일 경우, 이 영역에 저장되어 처리된다.
Til next time,
Jeong-Yoon
at 00:00
