Java 메모리 구조
메모리 (Memory)
프로그램을 실행하기 위한 데이터 및 명령어를 저장하는 공간입니다.
※ 메모리 구조를 공부하는 이유
- 같은 기능의 프로그램이더라도 메모리 관리에 따라 성능이 좌우됩니다.
- 메모리 관리가 제대로 되지 않은 경우 속도가 저하되거나 튕김 현상이 발생할 수 있습니다.
- 한정된 메모리를 효율적으로 사용하여 최고의 성능을 내기 위함입니다.
Java 프로그램 실행 구조
프로그램이 실행되기 위해서는 윈도우(window) 나 리눅스(linux) 등의 운영체제(OS) 가 제어하고 있는 시스템의 리소스의 일부인 메모리(RAM, 주기억장치) 를 제어할 수 있어야하는데, Java 이전에 C 와 같은 대부분의 언어로 만들어진 프로그램은 이러한 이유때문에 OS에 종속되어 실행되어졌습니다.
Java 프로그램은 JVM(Java Virtual Machine : 자바 가상 머신) 이라는 프로그램만 있으면 실행이 가능한데,
JVM이 OS에게서 메모리 사용권한을 할당받고 JVM이 Java 프로그램을 호출하여 실행하게 됩니다.
OS에서는 독립되었지만 JVM이라는 프로그램에 종속적이게 되는 것이죠.
※ JVM (Java Virtual Machine)
- Java 와 OS 사이의 중개자 역할을 하며, Java 가 OS 에 구애받지 않고 재사용을 가능하게 해줍니다.
- 메모리 관리 기능 (Garbage Collection) 을 합니다.
- 역할 : 메모리 할당, bytecode 를 interpreter 형태로 맞추어 OS에 맞춰 번역과 실행합니다.
JVM 메모리 구조
- Java Source : 사용자가 작성한 Java 코드
- Java Compiler : Java 코드를 Byte Code 로 변환시켜주는 기능
- Class Loader : Class 파일을 메모리(Runtime Data Area) 에 적재하는 기능
- Execution Engine : Byte Code 를 실행가능하도록 해석해주는 기능
- Runtime Data Area : 프로그램을 수행하기 위해 OS 에서 할당받은 메모리 공간
※ 컴파일러 (javac.exe)
1. 사용자가 생성한 클래스 코드의 문법을 체크합니다.
2. 사용자가 생성한 클래스 코드에 컴파일러가 추가적으로 필요한 코드와 새로운 문법 코드를 삽입합니다.
- java.lang.package 의 import 기능 등 사용된 클래스의 전체 패키지 경로를 식별합니다.
- 상속이 없는 경우 object 를 기본 상속합니다.
- 생성자가 없으면 기본 생성자를 삽입합니다.
- Interface 라면 메소드에 public abstract 를 처리합니다.
- Java 최신 버전의 문법 코드로 변경합니다.
3. 기본적인 최적화 작업을 수행합니다.
4. Byte Code 로 변환합니다.
Runtime Data Area
- class Area (Method Area, Code Area, Static Area)
2. Stack Area (LIFO, Last In First Out)
-
메서드 호출시마다 각각의 스택 프레임 (그 메서드만을 위한 공간) 이 생성
-
메서드 안에서 사용되는 값을 저장, 호출된 메서드의 매개변수, 지역변수, 리턴 값 및 연산시 일어나는 값들을 임시로 저장
-
메서드 수행이 종료되면 프레임별로 삭제
③ Heap Area
- new 연산자로 생성된 객체와 배열을 저장하는 공간
- 클래스 영역에 로드된 클래스만을 생성한다.
- Garbage Collector 를 통해 메모리를 반환한다.
i) Permanent Generation
- 생성된 객체들의 정보의 주소 값이 저장된 공간
ii) New Area
- Eden : 객체들이 최초로 생성되는 공간
- Survivor : Eden에서 참조되는 객체들이 저장되는 공간
iii) Old Area : New Area에서 일정시간이상 참조되고 있는 객체들이 저장되는 공간
④ Native method stack area
- 자바 외의 다른 언어에서 제공되는 메서드들이 저장되는 공간
⑤ PC Register
- Thread 가 생성 될 때마다 생성되는 공간
- Thread 가 어떤 부분을 어떤 명령으로 실행할 지에 대한 기록
- 현재 실행되는 부분의 명령과 주소를 저장
5. 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에 비해 시간이 오래 걸리고 실행 중 프로세스가 정지
'Back-End > Java' 카테고리의 다른 글
[Java] this 용법과 활용 (0) | 2019.02.17 |
---|---|
[Java] main 메소드에서 static 을 적는 이유 (0) | 2019.02.17 |
[Java] Java 기본 설정(setting) (0) | 2019.02.17 |
[Java] StringBuffer (0) | 2018.11.11 |
[Java] 가운데 문자 추출하기 (0) | 2018.11.11 |
최근댓글