JVM 학습 (III) : 가비지 컬렉션 알고리즘

지역과 세대 재활용 아이디어의 원리

대학 운영 체제 또는 컴퓨터 구성 원리는 지방 원리라는 중요한 개념을 언급합니다.

지역성 CPU의 원리에 액세스를 지칭 메모리 액세스 명령 또는 데이터에 액세스 할 수 있는지, 액세스 된 메모리 셀이 연속의 작은 영역에 수집하는 경향이있다.

그것은이 원칙은 단지 지역화 된 메모리 캐시 (캐시), 액세스 메모리 (RAM), 디스크 (ROM)에 대해 얘기하지 않는 것을 발견했다. 사실, 이러한 캐시 memcache에 같은 프로젝트 레디 스의 사용은 또한 지역의 원칙의 중요성을 반영한다.

힙 공간 자바 가상 머신에서 활성 객체는 자바 가상 머신 세대 복구 알고리즘의 도입을 허용하는 대부분의 개체가 생성 된 후에는 여러 번 재활용됩니다의 작은 부분, 경향이있다. 나는 일의 연구자들은 지역의 원리에 의해 영감을하지 않는 모르겠지만, 지역의 원칙이 세대의 생각으로 이해 않습니다.

세대 복구 힙 새로운 세대에 공간과 옛 시대입니다. 새로운 세대는 새로 생성 된 객체를 저장하는 데 사용됩니다. 때 개체는 이전 시대로 이동하는 데 시간이 오래 살아있다. 새로운 세대와 노인의 특성은, Java 가상 머신은 다른 복구 알고리즘이 될 수 있습니다.

개체의 생존 시간의 새로운 세대의 대부분은, 그래서 짧은 회복 시간이 소요되는 알고리즘을 사용할 수 있으며, 일반적으로 마이너 GC라는 트리거 GC의 새로운 세대 매우 짧습니다.

쓰레기 수집 및 나이의 주파수가 높은되지 않도록 자주, 오랜 기간 동안 살아남을 수 나이 객체, 종종 옛 시대 가비지 컬렉션을위한 공간을 힙하는 시간의 부족. 그러나 나이의 회복은 많은 시간을 소비 복구 할 수있는 공간을 찾을 수있는 전체 힙 검사는 보통이다. 현대 가비지 컬렉터는 다양한 방법으로 전체 힙을 스캔 방지 할 수 있습니다. GC 기존의 전체 GC를했다.

이 문서, 우리가 초점 마이너 GC, 새로운 세대 즉, 가비지 컬렉터이다.

새로운 세대의 메모리 분할 및 복구 메커니즘

두 부분으로 하나, 그리고 두 포인터를 유지하기 위해 : 이전 언급 복제 알고리즘, 그의 아이디어는 공간이 1으로 나누어 져 힙입니다. 1 비율 (회사가 주어진 이론적 일 오브젝트의 98 %는의 몇 가지로 회수입니다) : 사실 복사 알고리즘 1을 유지하기 위해 필요하지 않도록 자바 가상 머신 활성 목표 때문에, 작은 부분이다. 우리의 예측에 따르면 새로운 세대가, 대부분의 개체의 죽음 복사 알고리즘은 효과가 아주 좋은 것입니다 데이터 복제 알고리즘의 소량을 필요로 사용하는 것으로 가정합니다. 따라서, 차세대 두 영역 에덴 서바이버 영역과 동일한 크기로 분할하고있다.

생존자 영역의 기본 크기는 수동으로 조정할 수 있습니다, 자동으로 조정됩니다. 그 참고, 더 많은 생존자 할당 된 메모리 영역, 힙 공간 사용의 낮은 효율성.

의 image.png

우리가 새로운 명령을 사용하면 새 지침은 에덴 영역에서 개체를 저장하는 메모리로 타개하게 될 것입니다. 새 에덴 영역은 새로운 객체의 전체 인 경우이 시간은 마이너 GC를 트리거합니다. GC 부 생존 개체 서바이버 영역으로 이동된다. 객체의 자바 가상 머신의 기록 생존자 지역은 여러 번 복제됩니다.

생존자의 빈 영역에 대한 포인터로, 같은과 계속 기사를 복제 알고리즘을 말하기. 마이너 GC, 에덴 영역과 라이브 객체가이 지역에서 복사하는 경우에 지적, 다음에서 포인터로 전환. 다음 번 있도록 콘텐츠가 비어 보장하기 위해 마이너 GC가있다.

오래된 승진 기회는 무엇인가

이전 시대로 승진 객체의 새로운 세대를 만들기 위해 두 가지 경우가 있습니다. 제 객체 복사 횟수가 설정 값에 도달한다. 객체 (기본 사용할 수, 15 15 번 복사 한 경우 -XX:+MaxTenuringThreshold수정),이 객체는 이전 시대로 승격됩니다. 서바이버 초 50 % 이상 차지한다 (가능한 -XX:TargetSurvivorRatio상기 버추얼 카피는 이전 시대의 더 많은 수의 객체를 복사하여 수정할 때).

마이너 GC는 전체 힙을 스캔하지 않도록하는 방법

우리는 가능한 객체의 객체의 새로운 세대를 참조하는 경우에만 마이너 GC, 그러나 오래된 GC 뿌리의 새로운 세대 스캔 바랍니다. 우리가 기대할 수 없다이 경우, 그래서 마이너 GC 참조가 고려되어야 할 때 객체 내부 GC 뿌리에 가입 된 기준 년의 새로운 세대의 새로운 세대로 이전 해. 당신은 GC의 새로운 세대는 이전 시대를 스캔하는 것을 발견 할 것이다, 아직 스캔 전체 힙과 동일하지 않습니다?

핫스팟 가상 머신이 문제를 해결하기 위해 카드 테이블 (카드 표) 기술을 사용합니다. 구체적인 동작은 512 바이트 카드에 스택 전체 자바 가상 머신이며, 각 카드의 식별 비트를 저장하는 테이블을 유지한다. 카드 대신 플래그는 객체의 새로운 세대에 대한 참조를 포함합니다. 이 카드가 생각하는 경우가 더럽습니다.

마이너 GC는 그래서 당신은 전체 힙을 검색 할 수 없습니다 만, 카드 테이블에서 GC 뿌리에 추가 더러운 카드 객체에서 더러운 카드를 찾을 때. 카드 스캔 빈 플래그의 더러운 종료 후.

쓰기 장벽 (쓰기 장벽)

설명 액츄에이터에서는 Java 가상 머신은 각각의 업데이트의 동작을들 수있다 차단할 필요가 있고 위치에 대응하는 플래그가 dirty로 표시. 이 카드의 각 개체에 새로운 세대가에 표시되도록 가리킬 수 있습니다.
그러나 컴파일러에 의해 생성 된 인스턴트 기계 코드, 코드의 조각은 Java 가상 머신의 관리하에 없습니다. 따라서 코드의이 부분은 당신이 쓰기 장벽이라고 추가 로직을 삽입해야합니다.
쓰기 장벽은 새로운 세대를 대상 포인트 여부를 결정하지 않지만이 지역이 새로운 세대의 지적했다고 믿고. 이것은 간단한 시프트 연산으로 명령을 단순화한다. 쓰기 장벽은 성능 비용을 가져왔다,하지만 마이너 GC 처리량을 증가 있지만. 따라서 이러한 비용은 가치가있다.

가상 공유 (거짓 공유)

가정하자 CPU 캐시 라인 크기는 64 바이트 카드 (64)의 전체를 나타내는 엔트리 카드 (하나 바이트)입니다. 핫스팟 카드 각 페이지는 캐시 라인 카드 64 페이지 64 * 512 = 32킬로바이트의 합계에 해당되며, 512 바이트이다.
동일한 캐시 라인으로 이어질 똑같이 32킬로바이트 지역에서 객체 참조 업데이트 동작의 다른 스레드가 동시에 기록 캐시 라인을 일으키는 카드 테이블을 업데이트하는 경우, 프로그램 성능의 간접적 효과를 무효화하거나 동기 동작.
핫스팟은 새 매개 변수를 도입 -XX:+UseCondCardMark운영 쓰기 카드 테이블을 줄일 수 있습니다. 쓰기 장벽을 수행하기 전에 먼저 판사는 간단한 일을 할 수 있습니다. 카드가 페이지를 통해 확인 된 경우, 더 이상 확인되지 않습니다. 의사 코드는 다음과 같이 :

if (CARD_TABLE [this address >> 9] != 0)
  CARD_TABLE [this address >> 9] = 0;

개요

여기에 요약하면, 지역의 원리에서이 출발은 자바 가상 머신 세대 재활용 아이디어를 발생시킵니다. 세대 복구 힙 메모리는 신구의 생성 및 다른 가비지 콜렉션 알고리즘들로 분할되는 것을 의미한다.

상기 차세대 두 영역 에덴 서바이버 영역과 동일한 크기로 분할된다. GC의 새로운 세대의 마이너 GC된다. 마이너 GC 시간대 에덴의 실시간 객체는 생존자 존 생존자 존 포인트에 저장됩니다 지적했다. 공간 사용의 특정 복사본 번호 또는 값 생존자 지역에 따라 생존자 영역이 특정 값을 초과하면, 객체는 이전 시대로 승격됩니다.

객체의 마이너 GC에 대해 발생할 수있는 오래된 문제는 객체 참조의 새로운 세대를 포함, 핫스팟 가상 머신은 카드 테이블을 해결하기 위해 기술을 사용하는 것입니다.

참조 기사

JVM을 카드 테이블 (카드 표)
청 유 디 : 철저한 해체 가상 머신
자바 가상 머신의 -depth 이해 : JVM 고급 기능 및 모범 사례

추천

출처www.cnblogs.com/rever/p/11433109.html