자바 메모리 구조
자바의 메모리 관리는 확장 가능한 방식의 응용 프로그램을 조정하기 위해 필요한 기술이다.
JVM
JVM은 컴퓨터가 자바 프로그램을 실행할 수 있도록하는 추상 컴퓨팅 시스템이다.
JVM은 코드를 로드, 검사, 실행하고 런타임 환경을 제공한다.
이런 특징으로
- 자바 프로그램은 오류가 발행해도 JVM만 다운될 뿐 전체 시스템에 데미지를 주지 않는다.
- 플랫폼에 의존적이지 않아 모든 자바 프로그램의 구동이 가능하다.
- 동적할당을 프로그래머가 담당하는 C언어와 달리 JVM에서 관리한다.
구조
자바 실행 과정
1.실행 될 클래스를 메모리에 로드 후 초기화 작업을 수행
2. 메소드와 클래스 변수들을 해당 메모리 영역에 배치
3. 클래스 로드가 끝난 후 JVM은 main 메소드를 찾아 지역변수, 객체변수, 참조변수를 스택에 쌓음.
4. 코드를 따라 진행하면서 함수 호출, 객체 할당 등의 작업 수행
Runtime Data Area
Class Loader
프로그램 동작시 바이트 코드(.class파일) - 클래스를 메모리(아래 Runtime Data Area)로 적재한다.
Execution Engine
Class Loader에 의해 클래스들이 메모리에 적재되면, 클래스들을 기계어로 변경해 명령어 단위로 실행한다.
Interpreter 방식과 Just-In-time 컴파일러를 이용하는 방식이 있다.
Just-In-Time 컴파일러는 전체 바이트 코드를 네이티브 코드로 컴파일하여 실행할 수 있게 함으로서 성능을 높이는 방식이다.
Garbage Collector
Heap 메모리 영역에 생성된 객체들 중에 참조되지 않는 객체들을 탐색 후 메모리에서 제가한다.
참조가 없어질 때 바로 해제되는 것은 아니다.
GC가 수행되는 동안 GC를 수행하는 쓰레드가 아닌 다른 모든 쓰레드는 일시정지된다.
Runtime Data Area
자바 프로그램이 실행될 때 JVM이 운영체제로 부터 할당받는 메모리 영역이다.
자바 어플리케이션을 실행할 때 사용되는 데이터들이 적재된다.
용도에 따라 5개로 구성
- Mathod Area
- Heap Area
- Stack Area
- PC Register
- Native Method Stack
1, 2번 영역은 모든 쓰레드가 공유하고
3, 4, 5번 영역은 쓰레드 별로 생성되며 공유되지 않는다.
Method (Static) Area
클래스와 인터페이스의 런타임 상수(Constant Pool) 풀이다.
- static 변수(클래스 멤버 변수, 정적 변수)
- 메소드
- 생성자
- final class 변수 ... 등
Heap Area
자바 프로그램이 실행되어 JRE 클래스 및 동적으로 생성된 Java 오브젝트가 저장되는 공간이다.
새로운 객체는 항상 힙 공간에 생성되며이 객체에 대한 참조는 스택 메모리에 저장된다.
메소드 영역에 로드된 클래스만 생성이 가능하다.
이러한 개체는 전역 액세스 권한이 있으며 응용 프로그램의 어느 곳에서나 액세스 할 수 있고,
다른 객체의 필드 또는 스택에 존재하는 다른 메소드에 의해 참조되며,
참조하는 변수가 없으면 필요없는 것으로 간주되어 Gabage Collector에 의해 해제된다.
- new 키워드로 생성된 객체
- 배열 ... 등
Stack Area
정적 메모리 할당 및 스레드 실행에 사용된다.
여기에는 메소드에 고유 한 (1)기본 값과 메소드에서 (2)참조되는 힙에있는 오브젝트에 대한 참조가 포함한다.
Last-In-First-Out (LIFO)의 구조이다.
메소드가 호출되면 이 영역에 할당되고, 사용이 종료되는 해제된다.
각 스레드는 스레드마다 하나의 스택을 할당받게 된다.
힙 영역의 객체를 참조할 수 있다.
- 지역변수, 파라미터, 리턴 값
- 연산에 사용되는 임시 값
int a = 10; // 스택에 int 크기의 메모리 공간을 확보하고 이름이 a라고 붙여준다. 값은 10.
Person p = new Person(); // Person p를 스택에 생성하고, new로 생성된 Person의 인스텀스를 힙에 생성한다. 스택에 p는 힙 영역의 주소값을 가지고 있게 된단. 이를 참조라고 표현한다.
PC Register
수행중인 JVM 명령 주소(Program Counter)를 저장한다.
Thread가 생성될 때마다 생성된다.
Program Counter : Thread가 실행되는 부분의 주소와 명령
Native Methos Stack
자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역이다.
보통 C나 C++ 등의 코드로 작성된 코드를 수행하기 위한 스택이다.
예제
class Person {
int pid;
String name;
// constructor, setters/getters
}
public class Driver {
public static void main(String[] args) {
int id = 23;
String pName = "Jon";
Person p = null;
p = new Person(id, pName);
}
}
'프로그래밍 > java' 카테고리의 다른 글
컴퓨터의 구조 및 프로그램 실행 과정 (0) | 2019.10.28 |
---|---|
멀티 스레드 (0) | 2019.05.30 |
String, StringBuffer, StringBuilder 중에 어떤 것을 사용해야 하나 (0) | 2019.05.29 |