JAVA 메모리 구조
Programming/Java자바 메모리 구조
※ 메모리 구조를 알아야 하는 이유는?
같은 기능의 프로그램을 사용하더라도 메모리 관리에 따라 성능이 좌우됨
메모리가 제대로 관리되지 않을 경우 속도저하 현상이나 튕김 등의 서비스의 영향이 생김
한정된 자원(메모리)을 효율적으로 사용하여 최고의 성능을 내기 위함
자바 프로그램의 실행구조
메모리 구조를 알아보기 전, 자바 프로그램이 실행되는 순서를 먼저 이해하는 것이 좋다.
프로그램이 실행되기 위해서는 윈도우나 리눅스같은 운영체제(OS)가 제어하고 있는 시스템의 리소스의 일부인 메모리(RAM : 주기억장치)를 제어할 수 있어야 한다. java이전의 C같은 언어로 만들어진 프로그램은 이러한 이유 때문에 운영체제(OS)에 종속되어 실행되게 되어 있었다.
반면, java프로그램은 JAM(Java Virtual Machine) 이라는 프로그램만 있으면 실행이 가능하다. JVM이 OS에게서 메모리 사용권한을 할당받고 JAM이 자바 프로그램을 호출하여 실행하게 된다. OS에서는 독립되었지만 JVM이라는 프로그램에 종속적이게 된다.(JVM을 실행시키고 다시 JVM이 프로그램을 실행시키는 방식이다 보니 OS에서 직접 제어 받는 방식보다는 속도면에서 느리다.)
※ JVM이란?
- Java Virtual Machine
- JAVA와 OS 사이에서 중계자 역할
- JAVA가 OS에 구애받지 않고 재사용을 가능하게 해 줌
- 메모리 관리 기능(Garbage Collection)
자바프로그램 실행 과정과 JVM메모리 구조
프로그램이 실행되면, JVM은 OS로부터 이 프로그램이 필요로 하는 메모리를 할당받고, JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.
- JAVA Source : 사용자가 작성한 JAVA 코드
- JAVA Compiler : JAVA 코드를 Byte Code로 변환시켜주는 기능
- Class Loader : Class파일을 메모리(Runtime Data Area)에 적재하는 기능
- Execution Engine : Byte Code를 실행 가능하게 해석해주는 기능
- Runtime Data Area : 프로그램을 수행하기 위해 OS에서 할당 받은 메모리 공간
1. 클래스 영역
Method Area, Code Area, Static Area로 불려진다.
Field Information : 멤버변수의 이름, 데이터 타입, 접근 제어자에 대한 정보
Method Information : 메서드의 이름, 리턴타입, 매개변수, 접근제어자에 대한 정보
Type Information : - Type의 속성이 Class인지 Interface인지의 여부 저장
- Type의 전체이름(패키지명+클래스명)
- Type의 Super Class의 전체이름
(단, Type이 Interface이거나 Object Class인 경우 제외)
- 접근 제어자 및 연관된 interface의 전체 리스트 저장상수 풀(Constant Pool)
- Type에서 사용된 상수를 저장하는 곳(중복이 있을 시 기존의 상수 사용)
- 문자 상수, 타입, 필드, Method의 symbolic reference(객체 이름으로 참조하는 것)도 상수 풀에 저장Class Variable
- Static 변수라고도 불림
- 모든 객체가 공유 할 수 있고, 객체 생성 없이 접근 가능Class 사용 이전에 메모리 할당
- final class 변수의 경우(상수로 치환되어) 상수 풀에 값 복사
2. 스택 영역
- Last In First Out (LIFO) 방식
- 메서드 호출 시마다 각각의 스택프레임(그 메서드만을 위한 공간)이 생성되게 됨.
- 메서드 안에서 사용되어지는 값들 저장, 호출된 메서드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장
메서드 수행이 끝나면 프레임별로 삭제
3. 힙 영역
new 연산자로 생성된 객체와 배열을 저장하는 공간
클래스 영역에 로드된 클래스만 생성가능
Garbage Collector를 통해 메모리 반환
Permanent Generation
- 생성된 객체들의 정보의 주소 값이 저장된 공간
New Area
- Eden : 객체들이 최초로 생성되는 공간
- Survivor : Eden에서 참조되는 객체들이 저장되는 공간Old Area : New Area에서 일정시간이상 참조되고 있는 객체들이 저장되는 공간
4. Native 매소드 영역 (Native method stack area)
자바 외의 다른 언어에서 제공되는 메소드들이 저장되는 공간
5. PC 레지스터 (PC Register)
Thread가 생성 될 때마다 생성되는 공간
Thread가 어떤 부분을 어떤 명령으로 실행할 지에 대한 기록
현재 실행되는 부분의 명령과 주소를 저장
Garbage Collection
참조되지 않은 객체들을 탐색 후 삭제
삭제된 객체의 메모리를 반환
Heap 메모리의 재사용
Minor Garbage Collection
i) New 영역에서 일어나는 Garbage Collection
ii) Eden영역에 객체가 가득 차게 되면 첫 번째 Garbage Collection 발생
iii) Survivor1 영역에 값 복사
iv) Survivor1 영역을 제외한 나머지 영역의 객체들을 삭제
v) Eden영역과 Survivor1영역의 메모리가 기준치 이상일 경우, Eden 영역에 생성된
객체와 Survivor1영역에 있는 객체 중 참조되고 있는 객체가 있는지 검사
vi) 참조되고 있는 객체를 Survivor2 영역에 복사
vii) Surviver2 영역을 제외한 영역의 객체들을 삭제
viii) 일정시간이상 참조되고 있는 객체들을 Old영역으로 이동
ix) 반복Major Garbage Collection (Full Garbage Collection)
i) Old영역에 있는 모든 객체들을 검사
ii) 참조되지 않은 객체들을 한꺼번에 삭제
iii) Minor Garbage Collection에 비해 시간이 오래 걸리고 실행 중 프로세스가 정지
'Programming > Java' 카테고리의 다른 글
PCB and Interrupt(PCB와 인터럽트) (0) | 2018.01.09 |
---|---|
프로세스 상태 전이도(Process State Diagram) (0) | 2018.01.08 |
GitHub(깃허브) 사용법 (0) | 2017.12.26 |