[java] 자바 힙 용어 : 젊고 오래된 세대와 영원한 세대?

나는의 개념을 이해하기 위해 노력하고있어 젊은 , 기존영구 세대는 자바 힙 용어로, 그리고 세 세대 간의 더 구체적으로 상호 작용.

내 질문은 :

  • 젊은 세대는 무엇입니까?
  • 구세대는 무엇입니까?
  • 영원한 세대는 무엇입니까?
  • 세 세대는 서로 어떻게 상호 작용 / 관계합니까?


답변

이것은 일반적인 오해처럼 보입니다. Oracle의 JVM에서 영구 생성은 힙의 일부가 아닙니다. 클래스 정의 및 관련 데이터를위한 별도의 공간입니다. Java 6 및 이전 버전에서는 내부 문자열도 영구 생성에 저장되었습니다. Java 7에서, 인터 닝 된 문자열은 기본 오브젝트 힙에 저장됩니다.

영구적 인 발전 에 관한 좋은 소식이 있습니다 .

JConsole에 대한 Oracle 가이드 의 각 공간에 대한 설명이 마음 에 듭니다 .

HotSpot Java VM의 경우 직렬 가비지 수집을위한 메모리 풀은 다음과 같습니다.

  • Eden Space (힙) : 대부분의 객체에 메모리가 처음 할당되는 풀입니다.
  • 생존자 공간 (힙) : Eden 공간의 가비지 수집에서 살아남은 개체가 포함 된 풀입니다.
  • Tenured Generation (힙) : 생존자 공간에 일정 시간 존재 한 개체가 포함 된 풀입니다.
  • 영구 생성 (비힙) : 클래스 및 메소드 객체와 같은 가상 머신 자체의 모든 반사 데이터를 포함하는 풀입니다. 클래스 데이터 공유를 사용하는 Java VM을 사용하면이 세대는 읽기 전용 영역과 읽기 / 쓰기 영역으로 구분됩니다.
  • 코드 캐시 (힙이 아님) : HotSpot Java VM에는 네이티브 코드의 컴파일 및 저장에 사용되는 메모리가 포함 된 코드 캐시도 포함되어 있습니다.

Java는 세대 별 가비지 콜렉션을 사용합니다. 이것은 객체 foo (일부 클래스의 인스턴스)가있는 경우 더 많은 가비지 수집 이벤트가 지속되면 (아직 참조가있는 경우) 더 많이 승격됩니다. 그것은 젊은 세대 (자기 공간이 에덴과 생존자)로 나뉘어 시작되며, 오랫동안 살아남 으면 결국 탕감 된 세대가 될 것입니다.


답변

힙은 다음과 같이 젊은이와 노인으로 나뉩니다.

젊은 세대 : 짧은 기간 동안 살면서 두 공간으로 나눈 곳입니다.

  • Eden Space :이 공간에 할당 된 새로운 키워드 메모리를 사용하여 객체를 생성 한 경우.
  • 생존자 공간 : 이것은 Eden 공간에서 Java 가비지 콜렉션 후에 생존 한 오브젝트를 포함하는 풀입니다.

Old Generation :이 풀에는 기본적으로 tenured 및 virtual (예약 된) 공간이 있으며 Young Generation에서 가비지 수집 후 남아있는 개체를 보유합니다.

  • Tenured Space : 이 메모리 풀에는 여러 가비지 수집 후에도 살아남은 개체가 포함됩니다. 생존 공간에서 가비지 수집 후에도 남아있는 개체를 의미합니다.

영구 생성 : 이름 으로이 메모리 풀에는 영구 클래스 메타 데이터 및 설명자 정보가 포함되어 있으므로 PermGen 공간은 항상 클래스와 정적 멤버와 같은 클래스에 연결된 공간을 위해 예약되어 있습니다.

Java8 업데이트 : PermGen 은 매우 유사한 메타 스페이스 로 대체되었습니다 .
주요 차이점은 메타 스페이스의 크기가 동적으로 조정된다는 것입니다. 즉, 런타임시 확장 될 수 있습니다.
Java 메타 스페이스 공간 : 제한 없음 (기본값)

코드 캐시 (가상 또는 예약) : HotSpot Java VM을 사용하는 경우 네이티브 코드의 컴파일 및 저장에 사용될 메모리를 포함하는 코드 캐시 영역이 포함됩니다.

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

예의


답변

젊은 세대는 무엇입니까?

젊은 세대는 모든 새로운 객체를 할당하고 세 곳이다. 젊은 세대가 채워지면 사소한 가비지 콜렉션이 발생합니다. 죽은 물건으로 가득한 젊은 세대는 매우 빠르게 수집됩니다. 살아남은 일부 개체는 노화되어 결국에는 이전 세대로 이동합니다.

구세대는 무엇입니까?

이전 세대는 오래 생존 한 개체를 저장하는 데 사용됩니다. 일반적으로 어린 세대 개체에 대한 임계 값이 설정되고 해당 연령이 충족되면 개체가 이전 세대로 이동됩니다. 결국 구세대를 수집해야합니다. 이 이벤트를 주요 가비지 수집 이라고합니다

영원한 세대는 무엇입니까?

영구 생성 메타 데이터 애플리케이션에서 사용되는 종류 및 방법을 설명하기 위해 필요한 JVM 포함한다. 영구 생성은 런타임시 애플리케이션에서 사용중인 클래스를 기반으로 JVM에 의해 채워집니다.

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

PermSize 및 MaxPermSize 매개 변수는 이제 무시됩니다

세 세대는 서로 어떻게 상호 작용 / 관계합니까?

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

이미지 소스 및 Oracle TechNetwork 자습서 기사 : http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/java/gc01/index.html

일반 쓰레기 수집 프로세스 위의 문서는”많은 도표와 그들 사이의 상호 작용을 설명합니다.

요약 다이어그램을 살펴보십시오.

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


답변

Java 가상 머신은 3 세대, 즉 젊은 세대, 구세대 및 영구 세대로 구성됩니다. 대부분의 객체는 초기에 젊은 세대에 할당됩니다. 구세대에는 여러 세대의 젊은 세대 컬렉션에서 살아남은 객체와 구세대에 직접 할당 될 수있는 큰 객체가 포함되어 있습니다. 영구 생성에는 클래스 및 메소드뿐만 아니라 클래스 및 메소드 자체를 설명하는 오브젝트와 같이 JVM이 가비지 콜렉터를 관리하기에 편리한 오브젝트가 있습니다.


답변

SunHotSpot JVM의 메모리는 3 세대, 즉 젊은 세대, 구세대 및 영구 세대로 구성됩니다.

  • Young Generation : 새로 생성 된 객체가 young gen에 할당됩니다.
  • 구세대 : 새로운 객체가 더 큰 힙 공간을 요구하면 구세대에 직접 할당됩니다. 또한 몇 번의 GC주기에서 살아남은 객체는 예전 세대, 즉 예전 세대의 오래 살았던 객체 하우스로 승격됩니다.
  • 영구 생성 : 영구 생성에는 클래스 및 메소드뿐만 아니라 클래스 및 메소드 자체를 비롯하여 가비지 콜렉터가 관리하기에 편리한 JVM 객체가 있습니다.

참고 : 영구 세대는 Java 힙의 일부로 간주되지 않습니다.

세 세대는 서로 어떻게 상호 작용 / 관계합니까?
객체 (대형 객체 제외)는 먼저 젊은 세대에 할당됩니다. x x 이후에도 객체가 계속 남아있는 경우 가비지 콜렉션주기가 오래되거나 보존 된 세대로 승격됩니다. 따라서 우리는 어린 세대에는 짧은 수명의 개체가 포함되어 있고, 오래된 세대에는 수명이 긴 개체가 포함되어 있다고 말할 수 있습니다. 영구적 인 세대는 다른 두 세대와 상호 작용하지 않습니다.


답변