Java 메모리 풀은 어떻게 분할됩니까?


224

현재 jconsole로 Java 응용 프로그램을 모니터링하고 있습니다. 메모리 탭에서는 다음 중에서 선택할 수 있습니다.

Heap Memory Usage
Non-Heap Memory Usage
Memory Pool “Eden Space”
Memory Pool “Survivor Space”
Memory Pool “Tenured Gen”
Memory Pool “Code Cache”
Memory Pool “Perm Gen”

그들 사이의 차이점은 무엇입니까?


Sun JDK를 사용한다고 가정하면 가장 좋은 대답은 설명서 : Tuning Garbage Collection (JDK 1.5)Garbage Collection FAQ (JDK 1.4)
kdgregory

답변:


327

힙 메모리

힙 메모리는 Java VM이 모든 클래스 인스턴스 및 배열에 메모리를 할당하는 런타임 데이터 영역입니다. 힙은 고정 또는 가변 크기 일 수 있습니다. 가비지 수집기는 개체의 힙 메모리를 회수하는 자동 메모리 관리 시스템입니다.

  • Eden Space : 대부분의 객체에 메모리가 처음 할당되는 풀입니다.

  • Survivor Space : Eden 공간의 가비지 콜렉션에서 살아남은 오브젝트가 포함 된 풀.

  • Tenured Generation 또는 Old Gen : 생존자 공간에 일정 시간 존재 한 개체가 포함 된 풀입니다.

힙이 아닌 메모리

힙이 아닌 메모리에는 Java VM의 내부 처리 또는 최적화에 필요한 모든 스레드와 메모리간에 공유되는 메소드 영역이 포함됩니다. 런타임 상수 풀, 필드 및 메소드 데이터, 메소드 및 생성자 코드와 같은 클래스 별 구조를 저장합니다. 메소드 영역은 논리적으로 힙의 일부이지만 구현에 따라 Java VM이 가비지 수집하거나 압축하지 않을 수 있습니다. 힙 메모리와 같이, 메소드 영역은 고정 또는 가변 크기 일 수 있습니다. 메소드 영역의 메모리는 연속적 일 필요는 없습니다.

  • 영구 생성 : 클래스 및 메소드 객체와 같은 가상 머신 자체의 모든 반사 데이터를 포함하는 풀입니다. 클래스 데이터 공유를 사용하는 Java VM을 사용하면이 세대는 읽기 전용 영역과 읽기 / 쓰기 영역으로 구분됩니다.

  • 코드 캐시 : HotSpot Java VM에는 네이티브 코드의 컴파일 및 저장에 사용되는 메모리가 포함 된 코드 캐시도 포함되어 있습니다.

다음은 Jconsole 사용법에 대한 문서입니다 .


4
Java Virtual Machine Specification에 다음과 같이 명시되어 있으므로 @dfa가 완전히 정확하지는 않습니다. 그러나 jconsole에 코드 캐시 및 영구 생성이 힙이 아닌 것으로 표시되어 사양과 모순되는 것으로 보입니다. 누구든지이 모순에 대해 더 명확하게 설명 할 수 있습니까?
제임스 블룸

@JamesBloom-나는 똑같은 궁금했다. 기본 정의에 따라 어떤 메모리 풀이 어떤 유형 (힙 / 비힙)에 속하는지가 명시되어 있지만 상태가 명시 적으로 변경 될 수 있습니까?
Umang Desai

2
이 문서의 의미는 다음과 같습니다. docs.intergral.com/pages/viewpage.action?pageId=22478944 이 문서에는 찾아 볼 가치가있는 JVM에 대한 다른 좋은 정보가 포함되어 있습니다.
Steve Siebert

1
공감대가 많음에도 불구하고 실제로 의미있는 답변은 아닙니다. 예를 들어, "에덴 공간의 가비지 수집에서 살아남은 개체"는 무엇을 의미합니까? 생존 후이 물체가 에덴에서 생존자 공간으로 이동 했습니까? 아니면 에덴의 공간이 생존자 공간으로 간주됩니까? 그리고 Eden 공간 이외의 수영장에서 가비지 수집은 어떻습니까? 완전히 명확하지 않습니다.
Mikhail Batcer

스택을 잊지 마십시오 (힙이 아닌 쪽) :)
Toothless Seer 2016

70

새 키워드는 Java 힙에 메모리를 할당합니다. 힙은 전체 메모리 풀이며 전체 응용 프로그램에 액세스 할 수 있습니다. 해당 오브젝트에 할당 할 수있는 메모리가 충분하지 않으면 JVM은 가비지 콜렉션으로 힙에서 일부 메모리를 회수하려고 시도합니다. 여전히 충분한 메모리를 확보 할 수 없으면 OutOfMemoryError가 발생하고 JVM이 종료됩니다.

힙은 생성이라고하는 여러 섹션으로 나뉩니다. 더 많은 가비지 콜렉션에서 오브젝트가 남아 있으면 다른 세대로 승격됩니다. 이전 세대는 자주 가비지 수집되지 않습니다. 이러한 개체는 이미 오래 수명이 입증되었으므로 가비지 수집 가능성이 적습니다.

객체가 처음 구성되면 Eden Space에 할당됩니다. 가비지 콜렉션에서 살아남은 경우 생존자 공간으로 승격되어 오래 생존하면 Tenured Generation에 할당됩니다. 이 세대는 훨씬 덜 자주 가비지 수집됩니다.

영구 세대 또는 PermGen이라고하는 4 세대도 있습니다. 여기에있는 객체는 가비지 수집 대상이 아니며 일반적으로 클래스 정의 및 문자열 상수 풀과 같이 JVM을 실행하는 데 필요한 불변 상태를 포함합니다. PermGen 공간은 Java 8에서 제거 될 예정이며 메타 공간이라고하는 새로운 공간으로 대체 될 것이며,이 공간은 원시 메모리에 보관됩니다. 참조 :http://www.programcreek.com/2013/04/jvm-run-time-data-areas/

여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오


다이어그램은 매우 자명 해 보입니다 ... 이것은 모든 GC 알고리즘에 유효합니다. G1은 다른 세트를 가지고 있습니다.
Venkateswara Rao

내가 생각 @Pythoner 어두운 보라색의 플래그는해야 -XX:PermSize하지 -XX:MaxPermSize그것은 이미 위에서 정의되어있다.
Anurag


23

Java 힙 메모리 는 운영 체제에서 JVM에 할당 한 메모리의 일부입니다.

객체는 힙이라는 영역에 있습니다. JVM이 시작될 때 힙이 작성되며 애플리케이션이 실행되는 동안 크기가 증가하거나 감소 할 수 있습니다. 힙이 가득 차면 가비지가 수집됩니다.

여기에 이미지 설명을 입력하십시오

SE 질문 아래에서 Eden Space, Survivor Space, Tenured Space 및 Permanent Generation 에 대한 자세한 내용을 찾을 수 있습니다 .

젊은이, 임기 및 파마 세대

PermGen은 Java 8 릴리스 이후 메타 스페이스로 대체되었습니다.

귀하의 질문에 관하여 :

  1. Eden Space, Survivor Space, Tenured Space는 힙 메모리의 일부입니다
  2. 메타 스페이스 및 코드 캐시는 힙이 아닌 메모리의 일부입니다.

Codecache : JVM (Java Virtual Machine)은 원시 코드를 생성하여 codecache라는 메모리 영역에 저장합니다. JVM은 동적으로 생성 된 인터프리터 루프, JNI (Java Native Interface) 스텁 및 JIT (Just-In-Time) 컴파일러에 의해 원시 코드로 컴파일되는 Java 메소드를 포함하여 다양한 이유로 원시 코드를 생성합니다. JIT는 코드 캐시의 최대 사용자입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.