반응형

Java 메모리 구조 


 

메모리 (Memory)

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

 

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

  • 같은 기능의 프로그램이더라도 메모리 관리에 따라 성능이 좌우됩니다.
  • 메모리 관리가 제대로 되지 않은 경우 속도가 저하되거나 튕김 현상이 발생할 수 있습니다.
  • 한정된 메모리를 효율적으로 사용하여 최고의 성능을 내기 위함입니다.

Java 프로그램 실행 구조 

프로그램이 실행되기 위해서는 윈도우(window) 나 리눅스(linux) 등의 운영체제(OS) 가 제어하고 있는 시스템의 리소스의 일부인 메모리(RAM, 주기억장치) 를 제어할 수 있어야하는데, Java 이전에 C 와 같은 대부분의 언어로 만들어진 프로그램은 이러한 이유때문에 OS에 종속되어 실행되어졌습니다.

Java 프로그램은 JVM(Java Virtual Machine : 자바 가상 머신) 이라는 프로그램만 있으면 실행이 가능한데,

JVM이 OS에게서 메모리 사용권한을 할당받고 JVM이 Java 프로그램을 호출하여 실행하게 됩니다.

OS에서는 독립되었지만 JVM이라는 프로그램에 종속적이게 되는 것이죠.

 

 JVM (Java Virtual Machine)

  • Java 와 OS 사이의 중개자 역할을 하며, Java 가 OS 에 구애받지 않고 재사용을 가능하게 해줍니다.
  • 메모리 관리 기능 (Garbage Collection) 을 합니다.
  • 역할 : 메모리 할당, bytecode 를 interpreter 형태로 맞추어 OS에 맞춰 번역과 실행합니다.

JVM 메모리 구조 

 

  • 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. Byte Code 로 변환합니다.

 

Runtime Data Area

  1. class Area (Method Area, Code Area, Static Area)

2. Stack Area (LIFO, Last In First Out)

  • 메서드 호출시마다 각각의 스택 프레임 (그 메서드만을 위한 공간) 이 생성

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

  • 메서드 수행이 종료되면 프레임별로 삭제

 

 

 

 

③ Heap Area

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

- 클래스 영역에 로드된 클래스만을 생성한다. 

- Garbage Collector 를 통해 메모리를 반환한다.

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

ii) New Area
- Eden : 객체들이 최초로 생성되는 공간
- Survivor : Eden에서 참조되는 객체들이 저장되는 공간

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


 

④ Native method stack area

- 자바 외의 다른 언어에서 제공되는 메서드들이 저장되는 공간


 

⑤ PC Register

- Thread 생성 때마다 생성되는 공간
- Thread
어떤 부분을 어떤 명령으로 실행할 지에 대한 기록
-
현재 실행되는 부분의 명령과 주소를 저장


5. Garbage Collection

- 참조되지 않은 객체들을 탐색 삭제
-
삭제된 객체의 메모리를 반환
- Heap
메모리의 재사용

 

① Minor Garbage Collection

i) New 영역에서 일어나는 Garbage Collection

ii) Eden영역에 객체가 가득 차게 되면 번째 Garbage Collection 발생

iii) Survivor1 영역에 복사
iv) Survivor1 영역을 제외한 나머지 영역의 객체들을 삭제
v) Eden영역과 Survivor1영역의 메모리가 기준치 이상일 경우, Eden 영역에 생성된
객체와 Survivor1영역에 있는 객체 참조되고 있는 객체가 있는지 검사
vi) 참조되고 있는 객체를 Survivor2 영역에 복사
vii) Surviver2 영역을 제외한 영역의 객체들을 삭제
viii) 일정시간이상 참조되고 있는 객체들을 Old영역으로 이동
ix) 반복

 

② Major Garbage Collection (Full Garbage Collection)

 

i) Old영역에 있는 모든 객체들을 검사
ii) 참조되지 않은 객체들을 한꺼번에 삭제
iii) Minor Garbage Collection 비해 시간이 오래 걸리고 실행 프로세스가 정지

반응형

'Back-End > Java' 카테고리의 다른 글

[Java] this 용법과 활용  (0) 2019.02.17
[Java] main 메소드에서 static 을 적는 이유  (0) 2019.02.17
[Java] Java 기본 설정(setting)  (0) 2019.02.17
[Java] StringBuffer  (0) 2018.11.11
[Java] 가운데 문자 추출하기  (0) 2018.11.11
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기