-
자바의 메모리 구조JAVA 2020. 9. 18. 01:11반응형
자바의 메모리 구조를 조사할 일이 생겨 예전에 배웠던 내용을 복습할 겸 조사를 해보았습니다.
아직 모르는 것이 많은 초보 개발자이기에 잘못된 점이 있으면 언제든지 지적 부탁드립니다.
우선 자바의 메모리 구조를 알아보기 전에 왜 메모리 구조에 대해 알아야 하며 자바 프로그램은 어떤 식으로 실행이 되는지에 대해 알아보겠습니다.
왜 메모리 구조에 대해 알아야 할까?
같은 스마트폰이더라도 메모리 관리를 잘 하지 못하면 성능이 떨어지듯이 같은 기능의 프로그램이더라도 메모리 관리가 잘 되어 있지 않으면 속도 저하, 에러 발생 등의 성능 차이를 보일수가 있습니다.
그렇기에 좋은 성능을 내기 위해 한정된 메모리를 효율적으로 사용할 줄 알아야 하며 이를 위해 메모리 구조를 알아둘 필요가 있는 것입니다.
자바 프로그램 실행 구조
위의 그림과 같이 일반 프로그램의 경우 실행되기 위해 OS(운영체제)가 메모리를 제어하여 실행이 되는 반면,
자바 프로그램의 경우는 JVM(Java Virtual Machine 자바 가상머신)이 OS에게 메모리를 할당 받아 프로그램을 실행시킵니다.
이러다 보니 자바의 경우 OS에서 종속적이지 않고 독립적입니다. 하지만 그만큼 JVM에서 종속적이고 JVM을 거쳐서 실행이 되기에 속도면에서 느리다는 단점이 있습니다.
JVM 메모리 구조
그렇다면 프로그램이 실행되었을 때 어떤 과정을 거치는지와 JVM의 메모리 구조에 대해 알아봅시다.
우선, 앞에서 말한것과 같이 프로그램이 실행되면 JVM은 OS로부터 메모리를 할당 받고 JVM은 이 메모리를 용도에 따라 4개의 영역으로 나누어 관리를 합니다.
1. Class Loader
class 파일을 Runtime Data Area에 적재해주는 기능을 가진 영역입니다. 위의 그림에서는 JAVA 컴파일러가 Person.java 파일을 Byte code로 이루어진 Person.class 파일로 변환시켜주고 이를 Class Loader에 의해 Runtime Data Area에 저장시켜줍니다.
2. Execution Engine
저장된 class 파일(Byte code)를 플랫폼에 맞는 기계어로 변환시켜서 실행해줍니다. 즉, 컴퓨터가 읽을 수 있는 언어로 바꿔주는 역할을 합니다.
3. Runtime Data Area
JVM이 프로그램 수행을 위해 OS에게 할당 받은 메모리 영역으로 class 파일을 저장하며 이 영역은 또 5가지의 영역으로 나누어 집니다. 그 부분은 바로 밑에서 다루겠습니다.
4. Garbage Collector
Runtime Data Area 중 Heap 영역에 생성된 객체 중 참조하지 않는, 즉 사용하지 않는 객체들을 메모리에서 해제하는 역할을 합니다.
Runtime Data Area (Memory Area) 구조
1. Method Area(Class Area, Static Area)
Method Area에서는 클래스 내의 전역변수(멤버변수)의 이름, 데이터 타입, 접근제어자에 대한 Field 정보와 Method의 이름, 리턴 타입, 매개변수, 접근제어자에 대한 Method 정보와 Type의 속성이 클래스인지 인터페이스인지의 여부를 저장하는 Type 정보, 상수 및 문자 상수, Type, Field, Method의 Reference 값들을 저장하는 상수 풀(Constant Pool), Static 변수라고 부르는 Class 변수 등을 저장합니다.
2. Heap Area
Heap Area는 new 연산자로 생성된 객체와 배열을 저장하는 영역입니다. Class Area에 로드된 객체만 생성 가능하며 Garbage Collector를 통해 사용되지 않는 객체는 제거가 됩니다.
3. Stack Area
메소드가 호출되면 이 Stack 영역에 각각의 메소드를 위한 메모리가 할당이 됩니다. 이때, 메소드 안에서 사용되어지는 값을 저장하며, 호출된 메소드의 매개변수, 지역변수, 리턴 값, 연산된 값들을 임시로 저장합니다. Last In First Out(LIFO) 자료구조 형식이기에 가장 나중에 들어온 Stack부터 순차적으로 수행되며 메소드 수행이 끝나면 프레임별로 삭제 됩니다.
4. PC register
Thread가 생성될 때마다 만들어지는 공간으로 어떤 부분을 어떤 명령으로 실행할 지에 대한 기록이 저장됩니다. 또한 현재 실행되는 부분의 명령과 주소를 저장합니다.
5. Native Method Stack
자바 외의 다른 언어(C, C++ 등)에서 제공되는 메소드들이 저장되는 공간입니다.
728x90'JAVA' 카테고리의 다른 글
[Study] 자바 1주차 과제 (0) 2020.11.17 [JAVA] 제네릭(Generic) 이란? (0) 2020.11.15 [JAVA] StringTokenizer (0) 2020.10.28 클래스, 객체, 인스턴스 (0) 2020.09.21 자바 설치 및 환경변수 설정 (0) 2020.09.01