자바 아키텍처 도로 - (11) JVM 힙 객체

  마지막으로 블로그, 우리는 JVM 런타임 메모리 모델, 힙, 스택, 프로그램 카운터, 네이티브 메소드는 요소 공간을 스택 말했다. 우리는 주요 힙 및 스택, 스택이 다시 말을 일반적으로 흐름 말, 우리는 힙이 각각 젊은 세대와 이전 시대 객체를 저장하는 데 사용되는 것을 알고있다. 그러나 콘크리트 힙은 그것의 객체를 저장하는 방법은? 그 옛날의 당신은 개체를 배치 할 수 있습니다합니다. 지금 나는 본다.

  

 

 

 기본 설정 인 경우, 일반적으로 경우입니다. , 200M 우리의 젊은 세대, 다음 에덴 지역 계정의 젊은 세대가 8/10 160M의 200M은 우리가, 600M에 아마 400M의 너무 오래된 메모리 힙 크기를 설정 가정, 새로운 개체가 나는이 일반적이다 나는 일반 아를 의미한다. 600M이 이후에서 각각 해당하고, 20M 차지하는 영역으로, 구체적으로 설명 사용, 면적 서바이버 40M 각 마이너 GC,이 영역에 배치 된 오브젝트를 완료 점유.

  난 그냥 가끔 객체가 그래서 특히 젊은 세대에 위치 무슨 분석하고, 그들이 이전 시대에 배치 될 때, 젊은 세대 아니다 말했다.

1 일 후에 GC 부, 생존자 대상 영역 착용감 생존.

공용  클래스 주요 {
     공공  정적  무효 메인 (문자열 []에 args) {
         바이트 [] BT1; 
        BT1 = 새로운  바이트 [60000 * 1024 ]; 
    } 
}

힙 메모리 로그에 가입, 우리는 인쇄 결과를 얻을 수 :

   우리는 BT1 새로운 미래를 얻을, 우리는 우리가 볼 것이다, 메모리가 거의 채워, 지금은 99 %이다 힙.

공용  클래스 주요 {
     공공  정적  무효 메인 (문자열 []에 args) {
         바이트 [] BT1, BT2; 
        BT1 = 새로운  바이트 [60000 * 1024 ]; 
        BT2 = 새로운  바이트 [10000 * 1024 ]; 
    } 
}

그리고 우리는 우리의 에덴 지역이 충분해야한다, BT2를 구축하고 BT1을 구축, 코드에서 배울 수있는 다음, 우리의 기억은 그것을 처리하는 방법이 될 것입니다. 우리는 결과보고

  우리는 이미 우리는 힙 메모리에 직접 배치 큰 개체를 직접 것, 맞지 않는 여전히 GC를 만들었지 만 볼 수 있습니다.

2, 이전 시대 객체의 장기 생존. minorGC, 개체 또는 살아 후 반복 된 후 즉, 우리가 객체의 이전 대상 연령 세대의 머리 내 집, 일반적으로 15 배, 15 세에 도달 이동, 우리는 개체의 고향을 이동.

3, 동적 객체의 나이를 결정합니다.

  이것은 우리가 minorGC를 완료 할 때 매우 중요한 이론적 지식, 그것은 아마, 객체가 약, 객체가 다음 분류가 계산됩니다 연령에 맞지 않는있을 수 있습니다, 우리의 유족이 지역에 인이 지역에 배치되어있다 그것은에 순차적으로 추가 1 세대 모든 연령의 합계를 더한 2 세대 세 플러스 3 세대 시대, 계산하는 것입니다 최대 세대 세되어 있지만, 과정을 추가, 당신은 m 개체의 세대 세에 추가 찾을 수 있습니다,이 지역의 전체 크기는 m을 포함, N 세대 세 개체가 이전 시대에 재배치하는 m 될 것입니다이 시간까지 작성되었습니다. 객체가 50 % 이상 생존자 지역 인 경우,이 나이가 들어있는 객체의 뒷면은 이전 시대에 배치됩니다.

바로 이전 시대에 넷, 큰 개체. 코드 세그먼트 봐.

공용  클래스 주요 {
     공공  정적  무효 메인 (문자열 []에 args) {
         바이트 [] BT1; 
        BT1 = 새로운  바이트 [90000 * 1024 ]; 
    } 
}

  위, 나는 우리가 내부에 맞아야 에덴 600m의보다 큰 객체를 생성, 99 %를 차지, 에덴에 배치 할 때 우리는 아마 600m의 객체를 생성 알고있다. 그럼 이전 시대에 직접 배치. 여기에 설정할 수있는 매개 변수입니다. 나는 다음 매개 변수를 설정하는 모양에 대한 매개 변수를 설정

-XX : PretenureSizeThreshold = 10000000 -XX : + UseSerialGC -XX : + PrintGCDetails   

공용  클래스 주요 {
     공공  정적  무효 메인 (문자열 []에 args) {
         바이트 [] BT1; 
        BT1 = 새로운  바이트 [20000 * 1024 ]; 
    } 
}

   우리는 그것은 이전 시대에 직접 배치되어, 큰 개체의 문 10M 객체, 우리는 거친 대상 20M을 만든, 매개 변수를 설정합니다. minorGC의 대상이 경험을 너무 여러 번, 당신이 맞지 않을이 시간을 활용, 살아되었을 수 있습니다 생각하는 JVM 가상 기회입니다, 당신은 가능한 한 빨리 우리의 오래된에의 그것을 혼합 위에있어.

5 세 공간 할당 보증 메커니즘.

  사실, 때마다 우리 minorGC 전에, 전체 GC를 할 수있다 일련의 작업이 될 것입니다, 우리는 과정이 봐.

 

 나는 다채로운지도 위의 설명합니다. 우리는 전체 에덴 지역 minorGC의 필요성을 얻을 때, 남은 공간이 나이의 크기를 보는 우선 순위를 부여합니다, 세 남아있는 공간은 우리가 실행중인 경우 수있는 우리의 나이의 나머지 공간 전체 GC, 수 우리의 에덴 지역 미만 minorGC 개체의 합이 될 것입니다.

정말 작은 경우 -XX를 구성 할 때, 우리가 내려 가서, 우리가 결정한다 : (기본 설정보다 jdk8) -HandlePromotionFailure이 매개 변수를, 나머지 세를 결정하기 위해 이동하도록 구성하는 경우, 직접 fullGC 구성되지 않은 경우 각 공간 minorGC보다 적은 후마다 우리는 다음 fullGC 수 minorGC 년 미만 된 경우, 이전 시대의 평균 개체 크기를 넣어합니다. 그렇지 않으면, 전체 GC가 필요하지 않습니다.

1 : 에덴과 생존자 (시작 및 끝) 기본 비율은 8 일,하지만 우리는 매개 변수 최적화, JVM 수 -XX : + 기본 매개 변수, 나는 -XX 그것을 변경 UseAdaptiveSizePolicy은 :하지 -UseAdaptiveSizePolicy 비가 1 : 최적화 8을 유지 하나.

  우리가 재활용 할 수있는 개체의 종류를 살펴 보자.

1 기준 계산 방법 (기본적인 필요가 순환 참조 목적은 파괴되지 않는다, 이는 메모리가 될 수 있음)

  고장을 참조하면, 카운터가 1만큼 감소되고, 그 위치에 대한 참조는, 카운터가 증가 될 때마다 개체 카운터에 대한 참조를 추가 한 타임 카운터 개체 0 것은 더 이상 사용중인. 

  GC 뿌리는 일반적으로 로컬 변수, 정적 변수, 로컬 변수 스레드 스택 등있어서 스택 루트.

2, 도달 성 분석 알고리즘.

  기본적인 아이디어는 검색을 시작 객체가 아닌 쓰레기 개체로 표시되는 위치를 아래로 노드에서 시작 지점으로 "GC의 뿌리"객체라는 알고리즘의 시리즈를 통해, 나머지 표시되지 않은 객체가 쓰레기 객체가 있다는 것입니다

3, 공통의 참조 타입.

  강한 참조 부드럽고 약한 참조 팬텀 참조 : 자바 참조 타입은 일반적으로 나누어 4 가지 타입의 

수입 java.lang.ref.SoftReference;
수입 java.lang.ref.WeakReference; 

공공  클래스 홈페이지 {
     공공  정적  무효 메인 (문자열 []에 args) { 
        사용자의 사용자 =  사용자 (); // 强引用 
        WeakReference를 <사용자> = USER2 새로운 WeakReference를 <사용자> ( 신규 사용자 ()); // 弱引用 
        하는 SoftReference <사용자> 사용자 3 = 새로운 하는 SoftReference <사용자> ( 신규 사용자 ()); // 软引用
    } 
}

  객체의 일반적인 유형은하는 SoftReference 소프트, 일반적으로 복구 할 수 없습니다와 함께 싸서 개체를 참조하지만, GC 마무리의 출시는 새로운 객체에 대한 공간을 발견 한 후, 객체는 이러한 소프트 참조에서 복구됩니다. 소프트 참조는 메모리에 민감한 캐쉬를 구현하는 데 사용됩니다. 

4, 최종 판정 대상의 생존을 마무리.

  당신이 논리를 쓸 수 있지만, 절대적으로, 그것은 가능성이 메모리 오버 플로우를 일으키는 객체를 복구 할 수 않습니다이 쓰기 위하여려고하지 않는 것이 좋습니다, 객체가 철회하는 것입니다 전에 방법은 마지막 실행 완료, 즉, 마무리 방법도 있습니다 우리의 목적을 "저장"할 수있다.

  심지어 도달 가능성 분석 알고리즘 객체에 도달 할 수없는, 그것은 "Feisibuke"이 아니며, 그들이는 "집행 유예"단계에 일시적으로 이번에는 정말 최소한 다시 표시 과정을 통해 이동 객체의 죽음을 선언 할 수 있습니다. 

  클래스는 쓸모의 클래스를 확인하는 방법

1. 클래스의 모든 인스턴스는 자바 클래스의 인스턴스가 존재하지 않는 힙 인 회복되었다.

2. 클래스의 클래스 로더가 복구되었습니다로드합니다.

클래스 객체에 해당하는 3의 java.lang.Class은하지 위치에 반영 클래스에 액세스하는 방법으로, 어떤 장소에서 참조되지 않습니다. 

  마지막으로, 우리는 탈출 분석을 봐주세요.

    JVM은 컴파일 및 혼합 모드, 여기에이 문제에 대한 간략하게, 또는 몽 서클 뒤에, 세 가지, 즉 모드, 설명 모델에서 실행됩니다.

설명 모델은 매우 모든 바이트 코드 메모리가없는 메모리 공간을 절약한다 이러한 장점은, 내부의 낮은 작동 효율을 박제, 행동을 컴파일 기계 코드에 라인 JVM 바이트 코드를 실행하지만, 빠른 시작됩니다.

편집 모드와 해석 모드는 달리, 모두가 한 번에 수행 할 모든 컴파일 된 머신 코드로 JVM 바이트 코드 및 기계 코드의 첫 번째입니다. 이것은 우리의 운영 효율성,하지만 공간이 소요되는 자원이 향상됩니다.

혼합 모드 인터프리터 등을 사용해서 상기 여전히 실행 코드 패턴의 합이지만, 약간의 "핫"코드의 JVM은 일반적으로 혼합 모드 코드 실행 편집 모드 실행 걸린다.

의 코드 조각을 살펴 보자.

공용  클래스 메인 {
     공공 사용자 getUserBeanTest () { 
        사용자 사용자 = 새 새 사용자 (); // 힙에 배치 
        반환 사용자; 
    } 


    공공  무효 userBeanTest () { 
        사용자 사용자 = 새 새 , 사용자 () // 머리와 방법에 배치 우선 순위 스택에. 
    } 
}

즉, 스택에 배치 될 수있다 아주 작은 물체가 분명하다. 중추절 휴일은 내일 MyBatis로 약까지하는 것은 기본 원칙을 달성하는 것입니다. 며칠은 우리의 JVM을 최적화하기 위해 계속 들어

추천

출처www.cnblogs.com/cxiaocai/p/11520731.html