자바 메모리 구조
메모리 구조를 정확히 이해하면, 같은 기능의 프로그램이더라도 메모리 관리에 따라 성능이 좌우돼며, 메모리 관리가 되지 않을 경우 속도저하 현상이나 튕김 현상이 일어날 수 있습니다. 또한 한정된 메모리를 효율적으로 사용하여 최고의 성능을 낼 수 있습니다.
다음은 자바 프로그램의 실행 구조입니다. 프로그램이 실행되기 위해서 windows나 linux같은 운영체제(OS)가 제어하고 있는 시스템의 리소스의 일부인 메모리(RAM:주기억장치)를 제어할 수 있어야 하는데, java 이전의 c같은 언어로 만들어진 프로그램은 이런 이유등으로 OS에 종속되어 실행됩니다.
반면, java 프로그램은 JVM(Java Virtual Machine) 이라는 프로그램만 있으면 실행이 가능하며, JVM이 OS에게서 메모리 사용권한을 할당받고 JVM이 자바 프로그램을 호출하여 실행하게 됩니다. 따라서 Java 프로그램은 OS가 아닌 JVM에게 종속적이게 됩니다. (JVM을 실행시키고 다시 JVM이 프로그램을 실행시키는 방식이다 보니 OS에 직접 제어받는 방식보다는 속도면에서 느립니다.)
자바 실행과정과 JVM 메모리 구조
프로그램이 실행되면, JVM은 OS로부터 이 프로그램이 필요로 하는 메모리를 할당받고, JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리합니다.
다음은 Runtime Data Area에 대해 상세하게 살펴보겠습니다.
클래스 영역
Method Area, Code Area, Static Area로 불리어 집니다.
1. Field Information: 멤버변수의 이름, 데이터 타입, 접근 제어자에 대한 정보
2. Method Information: 메서드의 이름, 리턴 타입, 매개변수, 접근제어자에 대한 정보
3. Type Information: Type의 속성이 Class인지 Interface인지의 여부 저장
- Type의 전체 이름(패키지명 + 클래스명)
- Type의 Super Class의 전체 이름(단, Type이 Interface이거나 Object Class인 경우 제외)
- 접근 제어자 및 연관된 interface의 전체 리스트 저장
4. Constant Pool(상수 풀)
- Type에서 사용된 상수를 저장하는 곳(중복이 있을 시 기존의 상수 이용)
- 문자 상수, 타입, 필드, Method의 Symbolic Reference(객체 이름으로 참조)도 상수풀에 저장
5. Class Variable
- Static 변수라고도 불림
- 모든 객체가 공유 할 수 있고, 객체 생성없이 접근 가능
6. Class 사용 이전에 메모리 할당
- final class 변수의 경우(상수로 치환되어) 상수 풀에 값 복사
스택 영역
Last In First Out(LIFO) 방식으로, 메소드 호출 시마다 각각의 스택프레임(해당 메소드만을 위한 공간)이 생성되게 됩니다. 메서드 안에서 사용되어지는 값들의 저장, 호출된 메서드의 매개변수, 지역변수, 리턴 값 및 연산시 일어나는 값들을 임시로 저장합니다. 메서드 수행이 끝나면 프레임별로 삭제가 됩니다.
힙 영역
new 연산자로 생성된 객체와 배열을 저장하는 공간으로 클래스 영역에 로드된 클래스만 생성 가능합니다. Garbage Collector를 통해 메모리를 반환하게 됩니다.
1. Permenent Generation: 생성된 객체들의 정보의 주소 값이 저장된 공간
2. New Area
- Eden: 객체들이 최초로 생성되는 공간
- Survivor: Eden에서 참조되는 객체들이 저장되는 공간
3. Old Area: New Area에서 일정시간 이상 참조되고 있는 객체들이 저장되는 공간
Native 메소드 영역
자바 외의 다른 언어에서 제공되는 메서드들이 저장되는 공간입니다.
PC 레지스터
Thread가 생성될 때마다 생성되는 공간으로 Thread가 어떤 부분을 어떤 명령으로 실행할 지에 대한 기록을 담고 있습니다. 현재 실행되는 부분의 명령과 주소를 저장합니다.
가비지 컬렉션
참조되지 않은 객체들을 탐색 후 삭제하는 역할을 합니다. 삭제된 객체의 메모리를 반환하며 Heap 메모리의 지속적인 재사용이 이루이도록 합니다.
Minor Garbage Collection
1) New 영역에서 일어나는 Garbage Collection
2) Eden 영역에 객체가 가득 차게 되면 첫 번째 Garbage Collection이 발생합니다.
3) Survivor1 영역에 값이 복사되고, Survivor1 영역을 제외한 나머지 영역의 객체들을 삭제합니다.
4) Eden 영역과 Survivor1 영역의 메모리가 기준치 이상일 경우, Eden 영역에 생성된 객체와 Survivor1 영역에 있는 객체 중 참조되고 있는 객체가 있는지 검사합니다.
5) 참조되고 있는 객체를 Survivor2 영역에 복사하게 됩니다.
6) Survivor2 영역을 제외한 영역의 객체들을 삭제하고 일정시간 이상 참조되고 있는 객체들은 Old 영역으로 이동합니다.
위 과정이 반복적으로 수행되며 Minor Garbage Collection이 일어납니다.
Major Garbage Collection
1) Old영역에 있는 모든 객체들을 검사합니다.
2) 참조되지 않은 객체들을 한꺼번에 삭제합니다.
Minor Garbage Collection에 비해 시간이 오래 걸리고 실행 중 프로세스가 정지됩니다.
'프로그래밍(TA, AA) > JVM 언어' 카테고리의 다른 글
[스프링] 스프링의 기술 (0) | 2017.06.10 |
---|---|
[스프링] 스프링이란 무엇인가? (18) | 2017.06.09 |
[JSP] 적절한 include 사용하기 (0) | 2017.05.30 |
[자바성능] 클래스 정보와 reflection (1) | 2017.05.24 |
[자바성능] static의 올바른 사용 (0) | 2017.05.10 |