자바의 메모리 구조

shin_stealer·2021년 2월 4일
5

Java의 메모리 구조에 대해서 공부했던 내용을 정리한 글입니다.
개인적으로 공부한 자료라 틀린 부분이 있을 수 있습니다.

왜? 프로그램의 메모리를 고려해야할까?

여기, 같은 기능을 하는 두 개의 프로그램이 있다고 가정해보자

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이 프로그램을 수행하기위해 운영체제로부터 할당받은 메모리 공간이다.

그렇다면 한 단계 더 들어가서 Runtime Data Area 는 어떻게 생겼을까?

Memory Area 의 구조

차례대로 살펴 보자.

1) Method Area

  • JVM이 실행되면서 생기는 공간이다.
  • Class 정보, 전역변수 정보, Static 변수 정보가 저장되는 공간이다.
  • Runtime Constant Pool 에는 말 그대로 '상수' 정보가 저장되는 공간이다.
  • 모든 스레드에서 정보가 공유된다.

2) Heap

  • new 연산자로 생성된 객체, Array와 같은 동적으로 생성된 데이터가 저장되는 공간
  • Heap에 저장된 데이터는 Garbage Collector 가 처리하지 않는한 소멸되지 않는다.
  • Reference Type 의 데이터가 저장되는 공간
  • 모든 스레드에서 정보가 공유된다.

3) Stack

  • 지역변수, 메소드의 매개변수와 같이 잠시 사용되고 필요가 없어지는 데이터가 저장되는 공간
  • Last In First Out, 나중에 들어온 데이터가 먼저 나간다
  • 만약, 지역변수 이지만 Reference Type일 경우에는 Heap 에 저장된 데이터의 주소값을 Stack 에 저장해서 사용하게 된다.
  • 스레드마다 하나씩 존재한다.

4) PC Register

  • 스레드가 생성되면서 생기는 공간
  • 스레드가 어느 명령어를 처리하고 있는지 그 주소를 등록한다.
  • JVM이 실행하고 있는 현재 위치를 저장하는 역할

5) Native Method Stack

  • Java 가 아닌 다른 언어 (C, C++) 로 구성된 메소드를 실행이 필요할 때 사용되는 공간
profile
I am a Blacksmith.

0개의 댓글