자바 힙 용어 : 젊고 오래된 세대와 영원한 세대?
나는의 개념을 이해하기 위해 노력하고있어 젊은 , 기존 및 영구 세대는 자바 힙 용어로, 그리고 세 세대 간의 더 구체적으로 상호 작용.
내 질문은 :
- 젊은 세대는 무엇입니까?
- 구세대는 무엇입니까?
- 영원한 세대는 무엇입니까?
- 세 세대는 서로 어떻게 상호 작용 / 관계합니까?
이것은 일반적인 오해처럼 보입니다. Oracle의 JVM에서 영구 생성은 힙의 일부가 아닙니다. 클래스 정의 및 관련 데이터를위한 별도의 공간입니다. Java 6 및 이전 버전에서는 내부 문자열도 영구 생성에 저장되었습니다. Java 7에서, 인터 닝 된 문자열은 기본 오브젝트 힙에 저장됩니다.
여기 영구적 인 발전 에 관한 좋은 소식이 있습니다 .
JConsole에 대한 Oracle 가이드 의 각 공간에 대한 설명이 마음 에 듭니다 .
HotSpot Java VM의 경우 직렬 가비지 수집을위한 메모리 풀은 다음과 같습니다.
- Eden Space (힙) : 대부분의 객체에 메모리가 처음 할당되는 풀입니다.
- 생존자 공간 (힙) : Eden 공간의 가비지 수집에서 살아남은 개체가 포함 된 풀입니다.
- Tenured Generation (힙) : 생존자 공간에 일정 시간 존재 한 개체가 포함 된 풀입니다.
- 영구 생성 (비힙) : 클래스 및 메소드 객체와 같은 가상 머신 자체의 모든 반사 데이터를 포함하는 풀입니다. 클래스 데이터 공유를 사용하는 Java VM을 사용하면이 세대는 읽기 전용 영역과 읽기 / 쓰기 영역으로 구분됩니다.
- 코드 캐시 (힙이 아님) : HotSpot Java VM에는 네이티브 코드의 컴파일 및 저장에 사용되는 메모리가 포함 된 코드 캐시도 포함되어 있습니다.
Java는 세대 별 가비지 콜렉션을 사용합니다. 이것은 객체 foo (일부 클래스의 인스턴스)가있는 경우 더 많은 가비지 수집 이벤트가 지속되면 (아직 참조가있는 경우) 더 많이 승격됩니다. 그것은 젊은 세대 (자기 공간은 Eden과 Survivor로 나뉘어 있음)에서 시작하여 오랫동안 살아남 으면 결국 tenured 세대로 끝날 것입니다.
힙은 다음과 같이 젊은이와 노인으로 나뉩니다.
젊은 세대 : 짧은 기간 동안 살면서 두 공간으로 나눈 곳입니다.
- 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 이후에도 객체가 계속 남아있는 경우 가비지 콜렉션주기가 오래되거나 보존 된 세대로 승격됩니다. 따라서 우리는 어린 세대에 짧은 수명의 개체가 포함되어 있고, 오래된 세대에는 수명이 긴 개체가 포함되어 있다고 말할 수 있습니다. 영구적 인 세대는 다른 두 세대와 상호 작용하지 않습니다.
'Programing' 카테고리의 다른 글
탐욕스럽지 않은 정규식을 작성하려면 어떻게해야합니까? (0) | 2020.03.14 |
---|---|
이 날짜 형식은 무엇입니까? (0) | 2020.03.14 |
Lightsail과 EC2의 차이점은 무엇입니까? (0) | 2020.03.14 |
== 이상의 String.Equals를 사용하는 이유는 무엇입니까? (0) | 2020.03.14 |
모든 전역 변수 / 지역 변수를 인쇄 하시겠습니까? (0) | 2020.03.14 |