상세 컨텐츠

본문 제목

JVM 메모리 관리

Java

by Wanderer Kim 2023. 5. 29. 20:29

본문

728x90

JVM 메모리 구조

JVM 메모리는 아래와 같이 나뉘어져 있습니다.

  • Heap 메모리
  • Non-Heap 메모리
  • Other 메모리

Heap 메모리

Heap 메모리는 모든 자바 클래스 인스턴스와 배열이 할당되는 메모리로 런타임 데이터 영역입니다. Heap은 자바가상머신이 시작될 때 생성되고 어플리케이션 실행중에 크기가 증가/감소될 수 있습니다. Heap의 최초크기는 -Xms VM 옵션으로 정의할 수 있습니다. Heap은 가비지컬렉터 전략에 따라 고정된 크기 또는 동적 크기가 될 수 있습니다. 최대 Heap 크기는 -Xmx 옵션으로 설정됩니다. 기본적으로 최대 Heap 크기는 64MB로 설정됩니다.

Non-Heap 메모리

자바가상머신은 Heap 이외의 Non-Heap 메모리를 가지고 있습니다. 이것은 JVM 시작할 때 생성되며 클래스당 구조체(런타임 상수풀, 필드, 함수 데이터, 함수와 생성자 코드, 고정 문자열 등등)을 저장하고 있습니다. Non-Heap 메모리의 기본 최대크기는 64MB입니다. 

기타 메모리

자바가상머신은 이 공간을 JVM 코드 자체, JVM 내부 구조체, 로딩된 프로파일러 에이전트 코드, 데이터 등을 저장하기 위해 사용합니다.

 

JVM Heap 메모리 구조

JVM Heap은 물리적으로 두 파트로 나뉘어집니다.

  • Nursery(Young영역)
  • Old 영역

Nursery는 새로운 객체가 할당으로 예약된 Heap의 부분입니다. Nursery가 가득차게되면, 특수한 Young 컬렉션을 실행하여 가비지가 수집됩니다. Nursery에서 오랫동안 유지된 모든 객체가 Old영역으로 이동하게 됩니다. 그래서 더 많은 객체 할당이 가능하도록 Nursery가 비워지게 됩니다. Nursery는 3개의 부분으로 나뉘게 됩니다.

  • Eden 메모리
  • 2개의 Survivor 메모리

자바 메모리 모델

영구 세대(Java8 이후 Metaspace로 교체됨)

영구 세대 또는 Perm Gen은 JVM에 요구되는 어플리케이션에서 사용되는 클래스와 함수를 서술한 메타데이터를 포함하고 있습니다.

Metaspace

자바8 에서는 Perm Gen이 없으며, Metaspace가 사용됩니다. Perm Gen은 자바 Heap에 상주하는 것과 달리 Metaspace는 Heap밖에 있습니다. 대부분 클래스 메타데이터 할당은 네이티브 메모리 밖에 할당되더 집니다. Metaspace는 기본적으로 자동으로 크기가 증가됩니다. Metaspace는 클래스와 메타데이터의 라이프타임을 클래스로더의 라이프타임과 일치하도록 합니다. 즉, 클래스로더가 살아있다면 메타데이터는 Metaspace에 살아있으며 해지되지 않습니다.

코드 캐시

자바프로그램이 실행할 때 계층화된 방식으로 코드를 실행합니다. 첫번째 계층에서 코드를 기계어로 컴파일 하기 위해 클라이언트 컴파일러를 사용합니다. 두번째 계층에서 서버 컴파일러를 위한 프로파일링 데이터가 사용되며 코드를 최적화하여 컴파일할 수 있게 합니다. 계층화된 컴파일방식은 자바 7에서는 기본적으로 비활성화 되어있지만 자바 8부터는 활성화 되어있습니다.

메모리 풀

메모리 풀은 JVM 메모리 관리자에서 생성하며 불변의 객체 풀을 생성하는데 사용됩니다. 메모리 풀은 Heap 또는 Perm Gen에 속하며 JVM 메모리 관리자 구현체에 따라 다릅니다.

런타임 상수 풀

런타임 상수 풀은 클래스에 있는 상수풀이 런타임때 클래스별로 표현되는 것 입니다. 클래스 런타임 상수 및 정적 함수를 포함합니다. 런타임 상수 풀은 함수 영역의 일부입니다.

자바 Stack 메모리

자바 Stack 메모리는 쓰레드 실행에 사용됩니다. 짧게 생존하는 함수에 정의된 값과 함수에서 참조하는 Heap의 다른 객체에 대한 참조를 포함합니다.

자바 Heap 메모리 파라미터

반응형

'Java' 카테고리의 다른 글

[자바 성능 튜닝] 성능 테스트 접근법  (0) 2024.04.07
ThreadLocal  (1) 2024.02.28
Stream API 개요  (0) 2023.05.05
CompletableFuture get()과 join()의 차이점  (0) 2023.05.02

관련글 더보기

댓글 영역