JVM 메모리 관리 메커니즘

《深入理解Java虚拟机 第3章》

1 참조 카운팅 알고리즘

고장을 참조하면, 카운터 값이 1만큼 감소되어, 자신의 위치에 대한 참조는, 카운터 값이 1만큼 증가 할 때마다 카운터의 오브젝트에 대한 참조를 추가하지 0 언제 카운터 객체가 더 이상 사용되고있다.

이점

간단한은 결정의 효율성은 대부분의 경우 그것은 좋은 알고리즘은 매우 높은

메모리를 관리하는 참조 카운팅 알고리즘을 사용하지 않는 애플리케이션 내부 주류 Java 가상 머신은, 주된 이유는 개체 간의 순환 참조의 문제를 해결하기 곤란하다는

2, 도달 성 분석 알고리즘

알고리즘의 기본 아이디어는 "GC의 뿌리"라는 일련의 시작 지점으로 객체를 통해 GC 뿌리에 객체가 어떤이없는 경우, (가) 참조라는 검색 경로 통과 체인, 이러한 노드에서 아래로 검색 시작 체인이 기준에 연결되어있을 때 사용할 객체 증명 (GC 뿌리에서 목적에 도달 할 수없는).

상용 프로그래밍 언어의 주류에 주류화, 도달 가능성 분석 생존에 의해 객체 여부를 결정하기 위해 호출됩니다.

GC의 뿌리 대상으로 다음과 같은 범주를 포함한다 :
객체 참조의 가상 머신 스택 (로컬 변수 테이블 스택 프레임).
방법 정적 속성 클래스 객체 영역을 참조.
문자 참조 방법 영역을 객체.
네이티브 메소드 스택 JNI (즉, 일반 말했다 기본 방법) 참조 된 개체

참조 3, 이야기

JDK 1.2, 자바의 개념이 확장되었다 참조 후, 참조 강한 참조, 소프트 참조, 약한 참조, 팬텀 참조로 구분된다.

  • 강한 참조

    유사 유비쿼터스 프로그램 코드 수단, Object obj = new Object()이러한 참조는만큼 여전히 강한 참조가 있기 때문에, 복구는 객체를 참조 떨어지지 않을 것입니다.

  • 소프트 참조

    또한 유용한 몇 가지를 설명하기 위해,하지만 반드시 반대하지. 객체와 관련된 소프트 참조를 들어, 시스템은 이러한 개체는 복구 복구 범위 내 두번째로 표시되며, 상기 메모리 오버 플로우 예외 전에 일어날 것이다. 복구가 충분한 메모리가있는 경우, 메모리 오버 플로우 예외가 발생됩니다. JDK 1.2 후에는 소프트 참조를 구현하는 SoftReference 클래스를 제공합니다.

  • 약한 참조

    다음 가비지 콜렉션이 발생할 때까지 중요하지 않은 객체를 설명하는 데 사용하지만, 그 강도가 소프트 참조의 일부보다 약한입니다, 개체에 대한 약한 참조와 관련된 경우에만 살아남을 수 있습니다. 가비지 컬렉터 작업에 관계없이 현재 메모리의 적정성이 회복 될 때 손실 된 개체가 약한 참조와 연관됩니다. JDK 1.2 이후, 약한 구현하는 WeakReference를 클래스를 제공했다.

  • 거짓 인용

    또한 약한 관계에 대한 참조 기준의 스펙터라고도. 완전히 자신의 생존 기간에 영향을주지 않습니다했다 팬텀 참조 오브젝트가 있는지, 팬텀 참조 객체 인스턴스에 의해 달성 될 수 없다. 와 관련된 객체에 가상 기준 설정 목적하는 물체 시스템 콜렉터를 복구 통지를 수신한다. JDK 1.2 이후, 가상 참조를 구현하는 PhantomReference 클래스를 제공했다.

    4, 삶과 죽음

    심지어 도달 가능성 분석 알고리즘 객체에 도달 할 수없는, 그것은 아니다 "Feisibuke"그들이하는 "집행 유예"단계에 일시적으로 이번에는 정말 최소한 통과하는 죽음의 객체를 선언하는 두 개의 라벨 프로세스를 :如果对象在进行可达性分析后发现没有与GC Roots相连接的引用链,那它将会被第一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法。当对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过,虚拟机将这两种情况都视为“没有必要执行”。

객체가 파이널 라이즈 () 메소드를 수행하기 위해 필요하다고 결정되면, 그 개체는 F 큐라고하는 큐에 배치되며, 이후 자동으로 우선 순위가 낮은 스레드 파이널을 설정하는 가상 머신 간 그것을 실행합니다. 여기서, 용어 "실행"이 메소드를 실행하는 가상 머신을 지칭하지만, 그래서 할 런의 종료를 기다리는 약속하지 않는 이유는 객체가 수행되는 경우, 파이널 라이즈 () 메소드가 느리거나 무한 루프의 발생 (극단이다 경우), 그것은 가능성이 영구적으로 대기에서 F-큐 큐 다른 목적으로 이어질 것조차 전체 메모리 복구 시스템 충돌 원인.

개체에서) (자신의 구조 마무리에 성공하는 경우 마무리 () 메서드는 개체의 죽음의 운명을 탈출 할 수있는 마지막 기회입니다, 나중에 GC는 두 번째 작은 마크에서 F-대기열 객체가 될 것이다 - 단지와 다시 연결하려면 체인의 객체에 대한 참조는 예를 들면, 자신 (이 키워드) 클래스 또는 객체 변수의 멤버 변수에 할당하고, 제 2 마크의 "회복"컬렉션에서 제거되도록, 관련 될 수있다 ; 객체가이 시간을 탈출하고 있지 않은 경우는 것을 기본적으로 그는 정말 회복했다.

5 영역 복구 방법

영구적 세대이다 핫스팟 가상 머신

두 부분의 주요 영구적 인 복구를 대신 가비지 수집

  1. 버려진 일정
  2. 쓸모없는 클래스

폐기물 및 재활용의 개체 일정 재활용은 Java 힙과 매우 유사합니다.

문자열 "ABC는"정수 풀을 입력 한 경우, 예를 들어, 상수 리터럴 풀을 복구하려면,하지만 현재의 시스템이 즉 "ABC"라는 어떤 String 객체를 가지고 있지 않으며, 정수를 문자열 객체 참조는 없다 "ABC"상수 풀 타임 가비지 컬렉션이 발생하는 경우, 이러한 문자에 대한 다른 참조가 없으며, 필요한 경우 "ABC"일정이 시스템 상수 풀에서 삭제됩니다. 상수 풀을 참조 심볼 다른 클래스 (인터페이스), 메소드, 필드는 또한 유사하다.

동시에 세 가지 조건을 만족시킬 필요가 클래스

  1. 클래스의 모든 인스턴스는 인스턴스에서 Java 힙 클래스 존재하지 않는, 복구 된
  2. 로드 클래스의 클래스 로더가 복구되었습니다
  3. 클래스 객체에 해당하는 java.lang.Class의은하지 위치에 반영 클래스에 액세스하는 방법으로, 어떤 장소에서 참조되지 않습니다.

메모리 할당 및 복구 전략

  1. 에덴에서 우선 순위 할당 개체

    에덴 영역을 할당 할 충분한 공간이없는 경우, 가상 머신은 마이너 GC를 시작합니다;

새로운 세대 GC (마이너 GC) :

그것은 쓰레기 수집 활동의 새로운 세대의 장소를 의미한다;

이전의 GC (주요 GC / 전체 GC) :

상기 GC 고령에서 발생 주요 GC 함께 지칭 발생 (메이저 GC 직접 전략 선택 프로세스가 어디하지만 절대적이지 모바일 전략 병렬 소기 콜렉터) 부 GC 적어도 한번

주요 GC 10 배 이상 마이너 GC의 속도보다 일반적으로 느린

  1. 직접 이전 해에 대형 오브젝트

    대형 오브젝트는 다음과 같습니다 자바 객체를 연속 공간의 많은 양의 필요성, 가장 일반적인 긴 문자열과 배열의 종류

  2. 개체의 장기 생존은 이전 연도를 입력합니다

    객체가 에덴에서 태어나 살아 후 마이너 GC를 경험하고 생존자를 수용 할 수있는 경우, 그것은 생존자 공간으로 이동합니다 나이가 1로 설정됩니다. 생존자는 1 세 마이너 GC, 증가 나이, 그것이 어느 정도이며 나이 "통과"모든 영역에서 객체, 그들은 이전 시대로 승격됩니다 (기본값은 15 세입니다).

매개 변수에 의해 -XX : MaxTenuringThreshold입니다 연령 임계 값 설정을;

  1. 동적 객체의 나이 결정

    같은 나이의 생존자 공간의 합이 공간 생존자, 나이보다 더 나이 직접 살 갈 수있는 개체와 같은지에있는 개체 모두의 절반 이상 크기 인 경우, 필요 요구 사항에 세 MaxTenuringThreshold입니다 때까지 기다릴 수 있습니다.

  2. 공간 할당 보장

    이 발생하기 전에이 조건이 충족되는 경우 마이너 GC는 기존의 가상 머신의 사용 가능한 최대 연속 공간이 전체 공간의 새로운 세대의 개체 모든보다 큰지 여부를 먼저 확인, 다음, 마이너 GC는 안전하다는 것을 보장합니다. 만족하지 않는 경우, 가상 기회 HandlePromotionFailure 설정 보증 실패를 허용할지 여부를 검토합니다. 보다 큰 경우 허용 된 경우, 이전 세보다 큰 기존의 사용 가능한 최대 연속 공간 객체의 평균 크기로 승격되었는지 여부를 확인하는 것, 마이너 GC에도 불구하고, 마이너 GC를 수행하려고 시도는 위험하다; 이하면, 또는 HandlePromotionFailure 설정은 다음 전체 GC 번 변경해야합니다, 위험을 허용하지 않습니다.

추천

출처www.cnblogs.com/ffeiyang/p/12171407.html