[ Java ] 자바의 메모리 구조

kkatal_chae·2022년 8월 21일
0

Java

목록 보기
1/1
post-thumbnail

자바의 메모리 구조

JVM?

OS 의 메모리 영역에 접근해서 Java 의 메모리를 관리하는 가상의 프로그램

C, C++ 로 개발을 할 때는 사용자가 calloc, realloc, malloc 를 통해 메모리를 할당하고 free 로 메모리를 해제해줘야 한다. 하지만 자바에서는 가비지 컬렉터가 자동으로 메모리 영역 중에서 사용하지 않는 영역을 탐지해서 해제해준다.

  • Class Loader : Class 파일을 불러와서 메모리에 저장하는 역할
  • Execution Engine : Class Loader 에 저장된 Byte Code 를 명령어 단위로 분류하여 하나씩 실행하게 하는 엔진
  • Runtime Data Area : JVM 이 프로그램을 수행하기 위해 운영체제로부터 할당받은 메모리 공간

Memory Area 의 구조

Method Area

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

Heap

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

Stack

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

PC Register

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

Native Method Stack

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

Stack ↔ Heap

  • 기본 자료형 ( int, boolean, long ... ) 은 스택 메모리 영역에 변수명과 값이 함께 저장된다.
  • 참조형 ( 기본 자료형을 제외한 대부분 ex. String ) 은 스택 메모리 영역에 변수명과 함께 변수에 저장된 데이터가 위치값 ( 힙 메모리 어디에 위치하고 있는지에 대한 정보 ) 를 함께 저장하고, 힙 메모리에 데이터를 저장한다.

Static area(스태틱 메모리 영역)

하나의 JAVA 파일은 크게 필드(field), 생성자(constructor), 메소드(method)로 구성된다.

그중 필드 부분에서 선언된 변수(전역변수)와 정적 멤버변수(static이 붙은 자료형) Static 영역에 데이터를 저장한다.

Static 영역의 데이터는 프로그램의 시작부터 종료가 될 때까지 메모리에 남아있게 된다. 

다르게 말하면 전역변수가 프로그램이 종료될 때까지 어디서든 사용이 가능한 이유이기도 하다.

따라서 전역변수를 무분별하게 많이 사용하다 보면 메모리가 부족할 우려가 있어 필요한 변수만 사용할 필요가 있다.

[JAVA/자바] 메모리 구조(static, stack, heap)

[JAVA] JAVA 메모리 이야기 - Stack 과 Heap

자바의 메모리 구조

0개의 댓글