프로그램이 구동되기 위해서는 프로그램 구동시 운영체제로부터 메모리(RAM) 공간을 할당 받아야한다.
하지만 메모리는 무제한이 아니라 한정되어 있기에 효율적으로 사용하는 프로그램을 작성해야 하고
프로그램을 잘못 작성하게 되면 프로그램이 느려지거나, 꺼지는 등 문제가 발생할 수 있다.
자바로 만들어진 프로그램은 JVM을 통해 실행되고 이 JVM은 프로그램을 동작할 때 OS로부터 메모리를 할당한다.
왜? 프로그램의 메모리를 고려해야할까?
여기, 같은 기능을 하는 두 개의 프로그램이 있다고 가정해보자
1) 메모리 설계가 잘 되어 있는 프로그램
2) 그렇지 않은 프로그램
1번 프로그램에 비해 2번 프로그램에서는
속도 저하 현상이나 튕김 현상이 일어날 확률이 크다.
보다 안정적인 프로그램을 개발하려면
메모리 구조를 이해하고 적절하게 사용할 수 있어야 할 것이다.
자바의 프로그램 실행 구조
JVM 의 전체적인 구조
- Source Code (.java) 파일을 Java Compiler를 통해서 Byte Code(.Class)파일로 변환한다. (컴퓨터가 이해할 수 있는 코드로 변환)
- Byte Code로 변환된 파일을 JVM의 Class Loader 로 보낸다.
- Class Loader는 말 그대로 Class 파일을 불러와서 메모리에 저장하는 역할을 한다.
- Execution Engine 은 Class Loader에 저장된 Byte Code를 명령어 단위로 분류하여 하나씩 실행하게 하는 엔진이다.
- Garbage Collector 는 사용하지 않거나 필요없는 객체들을 메모리에서 소멸시키는 역할을 한다.
- Runtime Data Area (Memory Area) 는 JVM이 프로그램을 수행하기위해 운영체제로부터 할당받은 메모리 공간이다.
메소드(Method) 영역
- JVM이 실행되면서 생기는 공간이다.
- Class 정보, 전역변수 정보, Static 변수 정보가 저장되는 공간이다.
- Runtime Constant Pool 에는 말 그대로 '상수' 정보가 저장되는 공간이다.
- 모든 스레드에서 정보가 공유된다.
스택(Stack) 영역
- 지역변수, 메소드의 매개변수와 같이 잠시 사용되고 필요가 없어지는 데이터가 저장되는 공간
- Last In First Out, 나중에 들어온 데이터가 먼저 나간다
- 만약, 지역변수 이지만 Reference Type일 경우에는 Heap 에 저장된 데이터의 주소값을 Stack 에 저장해서 사용하게 된다.
- 스레드마다 하나씩 존재한다.
힙(Heap) 영역
- new 연산자로 생성된 객체, Array와 같은 동적으로 생성된 데이터가 저장되는 공간
- Heap에 저장된 데이터는 Garbage Collector 가 처리하지 않는한 소멸되지 않는다.
- Reference Type 의 데이터가 저장되는 공간
- 모든 스레드에서 정보가 공유된다.
멀티 스레드에서 메모리는 어떻게 사용되는가 ?
멀티 스레드에서 메모리 영역을 살펴보자면 메소드 영역과 힙 영역은 모든 스레드가 같이 공유하는데 반해 스택의 경우에는 각 스레드별로 하나씩 생성되어집니다. 이러한 특성으로 각 스레드마다 스택 메모리는 다른 스레드에서 접근이 불가능한 반면에 Method Area와 Heap Area는 모든 스레드에서 접근이 가능하고 프로그램의 시작부터 종료 될 때까지 메모리에 남아 프로그램이 실행되고 있다면 어디서든지 사용이 가능합니다. 이것이 전역변수는 어디서든 접근할 수 있고, Heap 영역의 객체를 주기적으로 삭제해주어야 하는 이유가 됩니다.
참고블로그
'Java > Java' 카테고리의 다른 글
[Java]향상된 for문 (0) | 2022.11.11 |
---|---|
[Java]배열(Array) 선언 및 초기화,복사 (0) | 2022.11.11 |
[Java]기본타입과 참조타입 (0) | 2022.11.11 |
[Java]별 찍기 피라미드 (0) | 2022.11.10 |
[Java]BufferedReader (0) | 2022.11.10 |
댓글