[java] Java 메모리 풀은 어떻게 분할됩니까?
현재 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”
그들 사이의 차이점은 무엇입니까?
답변
힙 메모리
힙 메모리는 Java VM이 모든 클래스 인스턴스 및 배열에 메모리를 할당하는 런타임 데이터 영역입니다. 힙은 고정 또는 가변 크기 일 수 있습니다. 가비지 수집기는 개체의 힙 메모리를 회수하는 자동 메모리 관리 시스템입니다.
-
Eden Space : 대부분의 객체에 메모리가 처음 할당되는 풀입니다.
-
Survivor Space : Eden 공간의 가비지 콜렉션에서 살아남은 오브젝트가 포함 된 풀.
-
Tenured Generation 또는 Old Gen : 생존자 공간에 일정 시간 존재 한 개체가 포함 된 풀입니다.
힙이 아닌 메모리
힙이 아닌 메모리에는 Java VM의 내부 처리 또는 최적화에 필요한 모든 스레드와 메모리간에 공유되는 메소드 영역이 포함됩니다. 런타임 상수 풀, 필드 및 메소드 데이터, 메소드 및 생성자 코드와 같은 클래스 별 구조를 저장합니다. 메소드 영역은 논리적으로 힙의 일부이지만 구현에 따라 Java VM이 가비지 수집하거나 압축하지 않을 수 있습니다. 힙 메모리와 같이, 메소드 영역은 고정 또는 가변 크기 일 수 있습니다. 메소드 영역의 메모리는 연속적 일 필요는 없습니다.
-
영구 생성 : 클래스 및 메소드 객체와 같은 가상 머신 자체의 모든 반사 데이터를 포함하는 풀입니다. 클래스 데이터 공유를 사용하는 Java VM을 사용하면이 세대는 읽기 전용 영역과 읽기 / 쓰기 영역으로 구분됩니다.
-
코드 캐시 : HotSpot Java VM에는 네이티브 코드의 컴파일 및 저장에 사용되는 메모리가 포함 된 코드 캐시도 포함되어 있습니다.
답변
새 키워드는 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/
답변
Java8을 사용하면 힙 영역이 아닌 영역에는 PermGen이 포함되지 않지만 Java8의 주요 변경 사항 인 Metaspace는 메타 데이터 크기를 jvm이 클래스 데이터에 필요한 공간에 따라 증가시킬 수 있으므로 java의 메모리 부족 오류를 제거해야합니다.
답변
Java 힙 메모리 는 운영 체제에서 JVM에 할당 한 메모리의 일부입니다.
객체는 힙이라는 영역에 있습니다. JVM이 시작될 때 힙이 작성되며 애플리케이션이 실행되는 동안 크기가 증가하거나 감소 할 수 있습니다. 힙이 가득 차면 가비지가 수집됩니다.
SE 질문 아래에서 Eden Space, Survivor Space, Tenured Space 및 Permanent Generation 에 대한 자세한 내용을 찾을 수 있습니다 .
PermGen은 Java 8 릴리스 이후 메타 스페이스로 대체되었습니다.
귀하의 질문에 관하여 :
- Eden Space, Survivor Space, Tenured Space는 힙 메모리의 일부입니다
- 메타 스페이스 및 코드 캐시는 힙이 아닌 메모리의 일부입니다.
Codecache : JVM (Java Virtual Machine)은 원시 코드를 생성하여 codecache라는 메모리 영역에 저장합니다. JVM은 동적으로 생성 된 인터프리터 루프, JNI (Java Native Interface) 스텁 및 JIT (Just-In-Time) 컴파일러에 의해 원시 코드로 컴파일되는 Java 메소드를 포함하여 다양한 이유로 원시 코드를 생성합니다. JIT는 코드 캐시의 최대 사용자입니다.