Java 힙 용어: 젊은 세대, 오래된 세대 및 영구 세대?
나는 자바 힙 용어에 젊은 세대, 늙은 세대, 영구 세대의 개념이 무엇인지, 보다 구체적으로 3세대 간의 상호작용을 이해하려고 노력하고 있다.
내 질문은:
- 젊은 세대란 무엇인가?
- 구세대란 무엇인가?
- 영구적인 세대는 무엇인가?
- 3대 세대는 어떻게 상호작용을 하고 서로 관계를 맺고 있는가?
이것은 일반적인 오해인 것 같다.오라클의 JVM에서 영구 생성은 힙의 일부가 아니다.클래스 정의와 관련 데이터를 위한 별도의 공간이다.자바 6 및 이전 버전에서는 삽입된 문자열도 영구 세대에 저장되었다.자바 7에서는 삽입된 문자열이 주 객체 힙에 저장된다.
Oracle의 JConsole 가이드에서 각 공간에 대해 설명한 내용이 마음에 든다.
HotSpot Java VM의 경우 가비지 수집을 위한 메모리 풀은 다음과 같다.
- 에덴 공간(heap):대부분의 개체에 대해 처음에 메모리가 할당되는 풀입니다.
- 서바이버 스페이스(heap):에덴 공간의 쓰레기 수거에서 살아남은 물체가 담긴 풀장.
- 종신형 세대(heap):생존자 공간에 한동안 존재했던 물체가 포함된 풀입니다.
- 영구 생성(비 heap):클래스 및 메서드 개체와 같이 가상 시스템 자체의 모든 반사 데이터가 포함된 풀입니다.클래스 데이터 공유를 사용하는 Java VM의 경우 이 세대는 읽기 전용 영역과 읽기-쓰기 영역으로 구분된다.
- 코드 캐시(비 heap):HotSpot Java VM은 또한 코드 캐시를 포함하며, 네이티브 코드의 컴파일 및 저장에 사용되는 메모리를 포함하고 있다.
Java는 세대 쓰레기 수집을 사용한다.즉, 개체 foo(일부 클래스의 한 예)가 있을수록 더 많은 쓰레기 수거 이벤트가 생존(아직 참조가 있는 경우)되고, 더 나아가 홍보된다는 뜻이다.그것은 젊은 세대(이덴과 서바이버)에서 시작되며, 만약 충분히 오래 살아남는다면 결국 종신 세대로 끝날 것이다.
힙은 다음과 같이 젊은 세대와 구 세대로 나뉜다.
젊은 세대 : 짧은 기간 동안 살았고 두 공간으로 나뉘었던 곳이다.
- 에덴(아담과 이브가 처음 살았다) 공간 : 이 공간에 할당된 새로운 키워드 메모리를 사용하여 객체를 만들었을 때.
- 서바이버 스페이스 : 에덴 공간에서 자바 가비지 수집 후 살아남은 물체가 있는 풀장이다.
구세대 : 이 수영장은 기본적으로 종신형 공간과 가상형(예치된) 공간을 포함하고 있으며, 영세대에서 쓰레기를 수거한 후 살아남은 물체들을 보관할 것이다.
- 테너드 스페이스:이 메모리 풀에는 다수의 가비지 수집이 Survivor 공간에서 가비지 수집 후 살아남은 객체가 포함되어 있다.
영구 생성 : 이름으로서의 이 메모리 풀은 또한 영구 클래스 메타데이터와 설명자 정보를 포함하고 있으므로 PermGen 공간은 항상 클래스에 예약되어 있고 예를 들어 정적 멤버와 같은 클래스에 연결된 공간이다.
Java8 업데이트:PermGen은 매우 유사한 Metaspace로 대체된다.
주요 차이점은 메타스페이스가 역동적으로 크기를 재조정한다는 점, 즉 런타임에 확장할 수 있다는 점이다.
Java Metaspace 공간: Unbounded(기호)
코드 캐시(가상 또는 예약): HotSpot Java VM을 사용하는 경우 기본 코드의 컴파일 및 저장에 사용되는 메모리를 포함하는 코드 캐시 영역을 포함한다.
젊은 세대란 무엇인가?
젊은 세대는 모든 새로운 물체가 할당되고 노후되는 곳이다.젊은 세대가 가득 차면, 이것은 사소한 쓰레기 수거를 야기한다.죽은 물건들로 가득 찬 젊은 세대는 매우 빨리 수집된다.살아남은 몇몇 물체들은 나이가 들어 결국 구세대로 옮겨간다.
구세대란 무엇인가?
구세대는 오래 살아남은 물체를 저장하는 데 사용된다.전형적으로 젊은 세대 객체에 대해 임계값을 설정하고 그 연령이 충족되면 객체는 구세대로 이동한다.결국 구세대는 거둬들일 필요가 있다.이 행사는 주요 쓰레기 수거라고 불린다.
영구적인 세대는 무엇인가?
영구적 생성은 JVM이 애플리케이션에서 사용하는 클래스 및 방법을 설명하는 데 필요한 메타데이터를 포함한다.영구 생성은 애플리케이션에서 사용 중인 클래스에 기반하여 런타임에 JVM에 의해 채워진다.
PermGen은 자바 8 출시 이후 Metaspace로 대체되었다.
PermSize & MaxPermSize 매개 변수는 지금 무시됨
3대 세대는 어떻게 상호작용을 하고 서로 관계를 맺고 있는가?
이미지 소스 & 오라클 기술 작업 튜토리얼 기사: http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
위 기사의 "일반적인 쓰레기 수거 과정"은 많은 도표를 가지고 그들 사이의 상호작용을 설명한다.
요약 다이어그램을 살펴보십시오.
자바 가상 머신은 젊은 세대, 구세대, 영구세대 등 3세대로 구성된다.대부분의 물체는 처음에 젊은 세대에게 할당된다.구세대에는 일부 젊은 세대 소장품에서 살아남은 물체뿐만 아니라 구세대에서 직접 할당될 수 있는 큰 물체도 포함되어 있다.영구 세대는 클래스 및 방법뿐만 아니라 클래스 및 방법 자체를 설명하는 개체와 같이 가비지 수집기가 관리하기에 편리하다고 판단되는 개체를 보유하고 있다.
SunHotSpot JVM의 메모리는 젊은 세대, 구세대, 영구세대 등 3세대로 구성된다.
- 젊은 세대 : 새로 창조된 물체들은 젊은 세대에게 할당된다.
- 구세대 : 새 개체가 더 큰 힙 공간을 요청하면 이전 gen에 직접 할당된다.또한 몇 번의 GC 사이클에서 살아남은 물체는 구세대(구세대)로 승격된다. 즉, 오래 산 물체는 구세대(구세대)에 있다.
- 영구적 생성 : 영구적 생성은 클래스 및 방법을 설명하는 객체, 클래스 및 방법 자체와 같이 가비지 수집기가 관리하기에 편리하다고 판단되는 객체를 JVM이 보유한다.
FYI: 영구적인 gen은 Java 힙의 일부로 간주되지 않는다.
3대 세대는 어떻게 상호작용을 하고 서로 관계를 맺고 있는가?큰 것(큰 것 제외)은 우선 젊은 세대에게 할당된다.x번 쓰레기 수거 주기 후에도 물체가 살아있는 경우, 오래된/텐더 생성물로 승격된다.따라서 우리는 젊은 세대가 짧은 생존 물체를 가지고 있는 반면, 늙은 장군은 긴 수명을 가진 물체를 포함하고 있다고 말할 수 있다.영구적인 유전자는 다른 두 세대와 상호작용하지 않는다.
'IT이야기' 카테고리의 다른 글
vue-resource http 인터셉터 내부에서 사용자를 리디렉션하는 방법 (0) | 2022.04.28 |
---|---|
vue js를 사용하여 클릭한 요소의 경고 ID를 선택하십시오. (0) | 2022.04.28 |
Linux에서 execlp()가 어떻게 작동하는지 이해할 수 없음 (0) | 2022.04.27 |
공리 응답의 데이터 처리 (0) | 2022.04.27 |
0.1 float가 0.1 double보다 크다.나는 그것이 거짓이라고 기대했다. (0) | 2022.04.27 |