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


318

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

내 질문은 :

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

Sun JDK / OpenJDK에 대해 이야기하고 있다고 가정하면 OpenJDK 웹 사이트의 Storage Management 페이지를 참조하십시오 . 하단에는 더 많은 정보로 연결되는 몇 가지 링크가 있습니다.
Nicholas Riley

1
또한이 질문과 관련이있다 "
고유

답변:


304

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

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

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

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

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

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


2
Java 7부터는 문자열이 더 이상 영구 생성에 구속되지 않는다고 생각합니다.
Tim Goodman

네 말이 맞아, 나는 이것이 언급되기 오래 전에 살아남은 것에 놀랐다. 그러면 Java 8에서 영구 생성은 메타 스페이스로 대체 될 것입니다 (그러나 기본적으로 제한이없는 것 외에는 이것이 얼마나 다른지 확실하지는 않습니다)
Joshua McKinnon

9
여호수아는 "오래된" "tenured"와 동의어이고 "새로운"는 "survivor"와 동의어입니까?
joadha

1
perm gen는 Java 8 이전에만 적용됩니다.
lwpro2

2
여전히 답변을 기다리는 경우, 맞습니다. @ joadha. 이 링크를 확인하십시오 : codeahoy.com/2017/08/06/basics-of-java-garbage-collection
recepinanc

197

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

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

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

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

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

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

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

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

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

예의


@Premraj Metaspace가 동적으로 크기를 조정 한다는 의미는 무엇입니까? 즉, 런타임에 확장 할 수 있습니다. ? 기본적으로 위쪽 테두리가 없다는 유일한 차이점은 무엇입니까?
gstackoverflow

1
우수 ..이 그림에서 메소드 영역, 네이티브 스택 및 런타임 상수 풀이 어디에 있는지 알 수 있습니까? 그리고 그에 따라 무엇을 보유하고 있습니까?

원시 메소드 코드에 코드 캐시가 사용되는 경우 원시 메소드 스택 (각 스레드에는 하나가 있음)에는 어떤 것이 있습니까?

49

젊은 세대는 무엇입니까?

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

구세대는 무엇입니까?

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

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

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

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

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

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

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

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

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

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

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


우수 ..이 그림에서 메소드 영역, 네이티브 스택 및 런타임 상수 풀이 어디에 있는지 알 수 있습니까? 그리고 그에 따라 무엇을 보유하고 있습니까?

자세한 내용은 docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html 을 참조하십시오. 메소드 영역은 가상 머신 시작시 작성됩니다. 메소드 영역은 논리적으로 힙의 일부이지만 간단한 구현에서는 가비지 수집 또는 압축을 선택하지 않을 수 있습니다. 각 런타임 상수 풀은 Java 가상 머신의 메소드 영역에서 할당됩니다
라빈 드라 BABU를

확실합니다 ... permgen 공간의 일부 (힙이 아님)를 읽고 있습니까? journaldev.com/2856/…

오라클 문서는 더 정통
라빈 드라 BABU

어린 세대 객체에 대한 임계 값이 시간 단위 (예 : ms)로 설정되어 있습니까? 아니면 GC 라운드?
Very Objective

16

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


1

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

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.