상세 컨텐츠

본문 제목

[Java] 메모리 구조

Backend/Java

by hyeminyy 2023. 11. 13. 20:31

본문

728x90

메모리 구조를 공부하는 이유는 ?

1. 같은 기능의 프로그램이더라도 메모리 관리에 따라 성능이 좌우된다.

2. 메모리 관리가 되지 않은 경우 속도저하 현상이나 튕김 현상 등이 일어날 수 있다.

3. 한정된 메모리를 효율적으로 사용하여 최고의 성능을 내기 위함이다.

 

메모리

- 프로그램을 실행하기 위한 데이터 및 명령어를 저장하는 공간

 

JAVA 실행구조

프로그램이 실행되기 위해서는 windows나 linux같은 운영체제(OS)가 제어하고 있는 시스템의 리소스의 일부인 메모리(RAM : 주기억장치)를 제어할 수 있어야 한다. JAVA 이전에 C 같은 대부분의 언어로 만들어진 프로그램은 이러한 이유 때문에 OS에 종속되어 실행되게 되어 있었다.

JAVA 프로그램은 JVM(Java Virtual Machine : 자바가상머신)이라는 프로그램만 있으면 실행이 가능한데, JVM이 OS에게서 메모리 사용권한을 할당 받고 JVM이 자바 프로그램을 호출하여 실행하게 된다.

OS에서는 독립되었지만 JVM이라는 프로그램에 종속적이게 된다. (JVM을 실행시키고 다시 JVM이 프로그램을 실행시키는 방식이다 보니 OS에 직접 제어 받는 방식보다는 속도면에서는 느리다는 단점을 가진다.

JVM이란 ?

- Java Virtual Machine

- JAVA와 OS 사이에서 중계자 역할

- JAVA가 OS에 구애받지 않고 재사용을 가능하게 해 줌

- 메모리 관리 기능 (Garbage Collection)

 

JVM은 무엇을 하는가 ?

- 메모리를 할당한다.

- bytecode를 interpreter 형태로 OS에 맞추어 번역, 실행한다.

- 번역, 실행 시 최적화를 수행한다.

 

자바 프로그램 실행 과정과 JVM 메모리 구조

프로그램이 실행되면, JVM은 OS으로부터 이 프로그램이 필요로 하는 메모리를 할당받고, JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다. JVM은 크게 3부분으로 나눌 수 있다. 클래스 파일을 로딩한 뒤 검증하고 초기화하는 Class loader subSystem, 클래스 파일을 저장하는 Runtime DataArea(이 곳은 다시 method area, heap, java stacks, px registers, native method stacks의 5가지 영역으로 나누어진다.), 클래스 파일(바이트코드)를 플랫폼에 맞는 기계어로 변환시켜 실행하는 Execution engine이다.

 

 

 

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. bytecode로 변환

 

 

Runtime Data Area

- Class Area

1. Method Area, Code Area, Static Area로 불리어진다.

- Field Information : 멤버변수의 이름, 데이터 타입, 접근 제어자에 대한 정보

- Method Information : 메서드의 이름, 리턴 타입, 매개변수, 접근제어자에 대한 정보

- Type Information : Type의 속성이 Class인지 Interface인지 여부 저장

 

2. Type의 전체이름 (패키지명 + 클래스명)

3. Type의 Super Class의 전체이름

4.접근 제어자 및 연관된 Interface의 전체 리스트 저장

 

Stack Area

Last In First Out (LIFO)

- 메서드 호출 시 각각의 스택 프레임이 생성

- 메서드 안에서 사용되어지는 값들 저장, 호출된 메서드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나느 값들을 임시로 저장

- 메서드 수행이 끝나면 프레임별로 삭제

 

Heap Area

- new 연산자로 생성된 객체와 배열을 저장하는 공간

- 클래스 영역에 로드된 클래스만 생성 가능

-Garbage Collector를 통해 메모리 반환

 

Permanent Generation : 생성된 객체들의 정보의 주소 값이 저장된 공간 

Eden : 객체들이 최초로 생성되는 공간

Survivor : Eden에서 참조되는 객체들이 저장되는 공간

Old : New Area에서 일정 시간 이상 참조되고 있는 객체들이 저장되는 공간

 

 

728x90

관련글 더보기