본문 바로가기
Java

JVM 메모리 구조

by Jordy-torvalds 2022. 7. 29.
반응형
  1. GeeksforGeek 사이트의 Java Memory Management란 글을 번역했습니다. 일부 내용을 의역했기 때문에 어색하거나 틀린 내용이 있으면 댓글에 남겨주시거나 위 링크에 접속해서 확인하세요.
  2. 번역 과정에서 일부 제가 강조하고 싶은 단어(몰랐던 단어)는 괄호로 표시 합니다.
  3. 번역이 힘들었던 부분은 아래에 원문을 별도로 기재합니다.

JVM 메모리 구조:

JVM을 프로그램이 실행되는 동안 사용되는 다양한 런타임 데이터 영역을 정의합니다. 몇몇 영역은 JVM에 의해 생성되는 반면 몇몇은 프로그램에서 사용되어지는 쓰레드에 의해 생성됩니다.

그러나 JVM에의해 생성된 메모리영역은 JVM이 종료될 때만 회수됩니다.

쓰레드의 데이터영역은 인스턴트화(instantiation)되는 동안 생성되고 쓰레드가 종료될 때 회수됩니다.

지금부터 세부적인 메모리 영역의 구성요소에 대해 공부해봅시다.

Heap(힙):

  • 힙은 공유되는 런타임 데이터 영역으로 메모리 내부의 실제 객체들이 저장됩니다. 힙은 가상 머신이 기동되는 동안 인스턴트화 됩니다.
  • 힙 메모리는 모든 클래스의 인스턴트와 배열을 위해 할당 되업니다. 힙은 시스템 구성에 따라 고정되거나 동적 사이즈가 될 수 있습니다.
  • JVM은 초기화 하기 위해서 사용자 제어를 제공하거나 혹은 요구사항에 따라 힙의 크기를 바꿉니다. 새로운 키워드가 사용되어질 때, 객체는 힙 메모리를 할당 받지만, 같은 참조는 스택에 존재합니다.
  • 실행 중인 JVM 프로레스를 위한 힙은 하나뿐입니다.

Scanner sc = new Scanner(System.in);

위 코드는 스캐너 클래스의 객체를 생성하며 힙 메모리에 할당되어지지만 sc란 참조는 스택에 푸쉬됩니다.

힙 메모리 내의 가비지 컬렉션은 의무적입니다.

Method Area(메소드 영역):

  • 힙 메모리의 논리적인 부분으로 VM이 기동되면서 생성되어집니다.
  • 메소드 영역의 메모리에 할당되어지는 데이터는 아래와 같습니다.
    • 클래스 구조
    • 메소드 데이터
    • 생성자 필드 정보
    • 인터페이스 혹은 클래스에서 사용되어지는 특별한 메서드
  • 계산에 필요한 대로 고정된 크기 또는 확장될 수 있다. 메모리는 인접하지 않아도 됩니다.

메소드 영역은 힙 메모리의 논리적인 부분으로, 비록 가비지 컬렉션이 힙 메모리 내에서 강제적(compulsory)이더라도, 메소드 영역은 가비지 컬렉션에 의해 수집될수도, 수집되지 않을 수 있습니다.

JVM Stacks (JVM 스택):

  • 스택은 쓰레드가 생성되어 질 때 함께 생성됩니다. 그리고 데이터나 부분적인 결과를 저장할 때 사용되어 집니다. 부분적인 결과는 결과를 반환하는 동안 메서드와 동적 링킹을 수행하기 위해 필요합니다.

Dynamic Linking(동적 링킹)
동적 라이브러리, 공유 라이브러리라고도 부르는 개념으로,
프로그램이 실행되는 동안 라이브러리가 필요할 때 해당 라이브러리(자바에서는 jar)를 메모리에 라이브러리 주소를 올리고 필요할 때 마다 해당 메모리로 이동해 처리 한니다.

  • 스택의 사이즈는 고정되거나 동적으로 변경될 수 있다. 스택의 사이즈는 생성되었을 때의 사이즈와 관계없이 선택되어 질 수 있습니다.
  • 스택에 대한 메모리는 연속적(contiguous)일 필요가 없습니다.

Native Method Area(네이티브 메서드 스택)

C 스택으로도 불리며, 네이티브 메서드 스택은 자바 언어로 작성되지 않았다. 이 메모리는 개별 쓰레드가 생성되어질 때 할당되어진다. 고정되거나 동적으로 사이즈가 설정될 수 있다.

Program counter (PC) registers

특정한 메서드의 작업을 실행하는 개별 JVM 쓰레드는 프로그램 카운터 레지스터가 연결되어 있습니다. 논 네이티브 메서드는 이용가능한 JVM 명령어의 주소를 저장하는 프로그램 카운터를 가지는 반면 네이티브 메서드는 프로그램 카운터의 값이 정의 되지 않습니다. 프로그램 레지스터는 몇몇 특정한 플랫폼에서 반환 주소와 네이티브 포인터를 저장할 수 있습니다.


지금까지 JVM 메모리 구조에 대해 알아보았습니다. 대략적으로 각 메모리 영역이 어떠한 데이터를 저장하는지만 파악하시고 세부적인 내용은 별도로 추가적으로 공부하시기 바랍니다.

이후에 관련 내용에 대한 이해도가 깊어지면 다시 한 번 다뤄보도록 하겠습니다. 읽어주셔서 감사합니다.

반응형