IT이야기

Java 힙 용어: 젊은 세대, 오래된 세대 및 영구 세대?

cyworld 2022. 4. 28. 20:36
반응형

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번 쓰레기 수거 주기 후에도 물체가 살아있는 경우, 오래된/텐더 생성물로 승격된다.따라서 우리는 젊은 세대가 짧은 생존 물체를 가지고 있는 반면, 늙은 장군은 긴 수명을 가진 물체를 포함하고 있다고 말할 수 있다.영구적인 유전자는 다른 두 세대와 상호작용하지 않는다.

참조URL: https://stackoverflow.com/questions/2129044/java-heap-terminology-young-old-and-permanent-generations

반응형