본문 바로가기
[JAVA]/JAVA 기본

JVM과 자바 메모리 구조 간단 요약 정리

by 팡펑퐁 2023. 5. 5.
728x90
💡 회사에서 받은 맥북으로 실무 과제를 진행하다가 java.lang.OutOfMemoryError: Java heap space라는 에러를 만났다. 이 에러는 힙 영역의 메모리 공간 부족 때문에 발생하는 에러이다. 평소 스택 영역, 힙 영역 등 자바의 메모리 부분에 대해 자세히 모르는 것이 찜찜했었기 때문에 이번 기회에 공부해 보자는 생각이 들었다.

 

 

JVM(Java Virtual Machine)

 자바는 컴파일러를 통해 기계어로 변환되는 언어이다. 컴파일이란 특정 프로그래밍 언어를 기계가 이해할 수 있게 번역하는 과정이다. 자바소스를 자바 컴파일러가 바이트 코드로 변환시키고 JVM은 바이트 코드를 운영체제에 맞는 기계어로 변환해 준다. 자바의 장점이라고 불리는 플랫폼 독립성, Write Once Run Anywhere은 자바를 공부한 사람이면 누구나 들어본 말이다. 운영체제 등 동작 환경에 관계없이 어디에서나 자바를 실행시킬 수 있는 환경을 만들어주는 역할을 하는 것이 바로 JVM이다.

 

 

구성요소

Class Loader

  • 컴파일러가 만든 클래스 파일을 JVM 내의 메모리 영역(Runtime Data Area)에 올리는 역할을 한다.
  • 런타임시에 동적으로 클래스를 로드한다.

Garbage Collector

  • 가비지 컬렉터는 메모리 관리 기능을 자동으로 수행한다.
  • 애플리케이션이 생성한 객체의 생존 여부를 판단하여 사용되지 않는 객체는 해제하는 방식으로 메모리를 자동으로 관리한다.

Execution Engine

  • Class Loader를 통해 JVM 내의 Runtime Data Area에 배치된 바이트 코드를 실행한다. 이때 Execution Engine은 자바 바이트 코드를 명령어 단위로 읽어서 실행한다.

Runtime Data Area

  • JVM 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터를 적재하는 영역이다. 이 영역은 크게 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack Area로 나뉜다.
  • Method Area
    • JVM에 의해 로딩된 클래스들이 저장되며 구현된 메서드, 상수들이 저장된다.
  • Heap Area
    • new 연산자로 생성된 객체와 배열을 저장한다. 주로 실행시간에 생성되는 객체를 저장한다.
    • 가비지 컬렉터에 의해 관리 된다.
  • Stack Area
    • 메서드가 호출될 때마다 스택 프레임이 생성되고 이것이 쌓여 스택을 구성한다.
    • 컴파일 시 size 및 life cycle이 정해진다.
    • 수행되는 메서드 정보, 지역변수, 매개 변수, 연산 중 발생하는 임시데이터를 저장한다.
    • 선입선출 구도로 push, pop 기능을 사용가능하다.
    • 원시 타입 변수는 스택 영역에 직접 값을 가진다.
    • 참조타입 변수는 힙 영역이나 메서드 영역의 객체 주소를 가진다.
  • PC Register
    • 현재 수행 중인 JVM 명령 주소를 갖는다.
    • Native Method Stack Area
    • 자바 외 언어로 작성된 네이티브 코드를 위한 곳이다.
    • 네이티브 메서드의 매개변수, 지역변수 등을 바이트 코드로 저장한다.

 

 

 

참고

https://developer111.tistory.com/33

728x90