자바 메모리 풀은 어떻게 분할됩니까?
현재 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이 모든 클래스 인스턴스와 어레이에 메모리를 할당하는 런타임 데이터 영역입니다.힙은 고정 크기 또는 가변 크기일 수 있습니다.가비지 컬렉터는 개체의 힙 메모리를 회수하는 자동 메모리 관리 시스템입니다.
에덴 공간:대부분의 개체에 처음 메모리가 할당되는 풀입니다.
서바이버 스페이스:에덴 공간의 가비지 컬렉션에서 살아남은 개체를 포함하는 풀입니다.
테넌트 제너레이션 또는 올드 제너레이션: 서바이버 공간에 오랫동안 존재했던 오브젝트를 포함하는 풀입니다.
비히프 메모리
비히프 메모리는 Java VM의 내부 처리 또는 최적화에 필요한 모든 스레드 및 메모리 간에 공유되는 메서드 영역을 포함합니다.런타임 상수 풀, 필드 및 메서드 데이터, 메서드 및 생성자 코드와 같은 클래스별 구조를 저장합니다.메서드 영역은 논리적으로는 힙의 일부이지만 구현에 따라 Java VM이 가비지 수집 또는 압축하지 않을 수 있습니다.히프 메모리와 마찬가지로 메서드 영역도 고정 크기 또는 가변 크기일 수 있습니다.메서드 영역의 메모리는 연속할 필요가 없습니다.
영구 생성:클래스 및 메서드 개체와 같은 가상 시스템 자체의 모든 반사 데이터를 포함하는 풀입니다.클래스 데이터 공유를 사용하는 Java VM에서는 이 세대는 읽기 전용 영역과 읽기/쓰기 영역으로 나뉩니다.
코드 캐시:또한 HotSpot Java VM에는 네이티브 코드의 컴파일 및 저장에 사용되는 메모리가 포함된 코드 캐시가 포함되어 있습니다.
다음은 Jconsole 사용 방법에 대한 설명서입니다.
new
자바어힙은 메모리의 메인 풀로, 애플리케이션 전체에 액세스 할 수 있습니다.해당 개체에 할당할 수 있는 메모리가 충분하지 않으면 JVM은 가비지 컬렉션을 사용하여 힙에서 일부 메모리를 회수하려고 시도합니다. 충분한 수 는, 「」를 해 주세요.OutOfMemoryError
JVM을 이용하다
힙은 세대라고 불리는 여러 섹션으로 분할됩니다.개체가 더 많은 가비지 컬렉션에서 살아남으면 다른 세대로 승격됩니다.기성세대는 쓰레기 수집을 자주 하지 않는다.이러한 개체는 수명이 더 길다는 것이 이미 입증되었기 때문에 쓰레기 수집 가능성이 낮습니다.
객체가 처음 구성될 때 에덴 공간에 할당됩니다.쓰레기 수거에서 살아남으면 서바이버 스페이스로 승격되고, 그곳에서 충분히 오래 살면 테넌드 세대에 배정된다.이 세대는 쓰레기 수집 빈도가 훨씬 낮다.
Permanent Generation(Perm Gen)이라고 불리는 4세대도 있습니다.여기에 상주하는 개체는 가비지 수집 대상이 아니며 일반적으로 클래스 정의 및 문자열 상수 풀과 같이 JVM을 실행하는 데 필요한 불변의 상태를 포함합니다.PermGen 공간은 Java 8에서 삭제될 예정이며 Metaspace라는 새로운 공간으로 대체될 예정입니다.이 공간은 네이티브메모리에 저장됩니다.참조:http://www.programcreek.com/2013/04/jvm-run-time-data-areas/
Java8을 사용하면 비히프 영역에는 PermGen이 포함되지 않고 Java8의 주요 변경 사항인 메타스페이스가 포함되므로 클래스 데이터에 필요한 공간에 따라 메타스페이스 크기가 증가할 수 있으므로 Java를 통해 메모리 부족 오류를 제거할 수 있습니다.
Java 힙 메모리는 운영 체제에 의해 JVM에 할당된 메모리의 일부입니다.
개체는 힙이라고 하는 영역에 있습니다.힙은 JVM이 시작될 때 생성되며 응용 프로그램이 실행되는 동안 크기가 증가하거나 감소할 수 있습니다.히프가 가득 차면 가비지가 수집됩니다.
Eden Space, Survivor Space, Tenued Space 및 Permanent Generation에 대한 자세한 내용은 아래 SE 질문을 참조하십시오.
PermGen은 Java 8 출시 이후 메타스페이스로 대체되었습니다.
문의 사항:
- Eden Space, Survivor Space, Tenued Space는 힙 메모리의 일부입니다.
- 메타스페이스와 코드 캐시는 비히프 메모리의 일부입니다.
코덱스:Java Virtual Machine(JVM; Java 가상 머신)은 네이티브코드를 생성하여 코덱이라고 불리는 메모리 영역에 저장합니다.JVM은 동적으로 생성된 인터프리터 루프, Java Native Interface(JNI; Java 네이티브인터페이스) 스터브, JIT 컴파일러에 의해 네이티브코드로 컴파일된 Java 메서드 등 다양한 이유로 네이티브코드를 생성합니다.JIT는 코덱케쉬의 가장 큰 사용자입니다.
히프는 다음과 같이 젊은 세대와 오래된 세대로 구분됩니다.
젊은 세대:그것은 물체가 짧은 기간 동안 살았던 곳이고 두 개의 공간으로 나누어져 있다.
- 에덴 공간:이 공간에 할당된 새로운 키워드 메모리를 사용하여 오브젝트가 생성된 경우.
- 생존자 공간(S0 및 S1):이 풀은 Eden 공간에서 사소한 Java 가비지 수집 후 살아남은 개체를 포함합니다.
구세대:이 풀에는 기본적으로 임대 및 가상(예약된) 공간이 포함되어 있으며 Young Generation에서 가비지를 수집한 후 남은 개체가 저장됩니다.
- 임대 공간:이 메모리 풀에는 여러 가비지 수집 후 생존한 개체가 포함되어 있습니다. 즉, Survivor 공간에서 가비지 수집 후 생존한 개체를 의미합니다.
설명.
우리의 어플리케이션이 이제 막 시작됐다고 가정해 봅시다.
따라서 이 시점에서 이들 3개의 공간은 모두 비어 있습니다(Eden, S0, S1).
새 객체가 생성될 때마다 에덴 공간에 배치됩니다.
Eden 공간이 가득 차면 가비지 수집 프로세스(마이너 GC)가 Eden 공간에서 실행되고 생존하는 개체는 S0으로 이동됩니다.
응용 프로그램은 계속 실행됩니다. 다음 번 가비지 수집 프로세스가 실행될 때 에덴 공간에 새 개체가 생성됩니다. 이 개체는 에덴 공간과 S0에 있는 모든 개체를 보고 S1로 이동합니다.
PS: Survivor 공간에서 오브젝트가 존속하는 시간의 설정에 따라 오브젝트는 S0 및 S1로 왔다 갔다 할 수 있으며, 그 후 임계값에 도달한 오브젝트는 구세대 힙스페이스로 이동됩니다.
언급URL : https://stackoverflow.com/questions/1262328/how-is-the-java-memory-pool-divided
'programing' 카테고리의 다른 글
nuxt 블로그의 컨텐츠 폴더에 있는 항목 수 가져오기 (0) | 2022.08.10 |
---|---|
Vuex 및 웹소켓 (0) | 2022.08.09 |
"BEGIN_OBJECT가 필요하지만 1행 1열에 STRING이었습니다." (0) | 2022.08.09 |
기존 웹 페이지 내에서 npm 없이 구성 요소 사용 (0) | 2022.08.09 |
argc가 넘칠 수 있나요? (0) | 2022.08.09 |