인터뷰, 토크 GC 메커니즘을보기

머리말

출처 : studyidea.cn/

GC중국어 통역 가비지 컬렉션은 피할 메모리 누수에 메모리 공간을 재 확보 메커니즘이다. 경우 JVM메모리 수행하여 꽉 GC재사용 가능 메모리를 차례로 새로운 객체에 할당 된 메모리의 효과적인 회수. JVM GC적극적인 참여를위한 메커니즘을 개발하고 자신의 작업 부하를 줄일 수 있지만, 경우에 따라서 자동으로 할 필요가 있지만 GC우리가 이해하고 발전해야하는 감소 시스템 성능, 느린 반응으로 이어질 것입니다 GC메커니즘을. 이러한 상황에 직면했을 때, 진정하기 위해하는 것은 문제를 해결한다. 또한 GC메커니즘 또한 Java고주파 질문을 인터뷰, GC가 필수적인 기술이다 이해합니다.

연구 GC, 우리는 먼저 세 가지 문제를 해결 :

  • 쓰레기는 무엇인가
  • 어디 쓰레기
  • 어떻게 쓰레기

쓰레기는 무엇인가

간단한 코드에서 살펴 보자.

암호

바이트 배열로 문자열로 객체를 통해 상기 코드는 다음 로컬 파일에 기록. 시작되면 방법, 그것은 새 개체에 대한 몇 가지 메모리를 할당하며, 다음 참조를 말해 str, bytes변수를. 상기 방법이 종료 될 때까지, 내부에있어서 로컬 변수는 즉시 소멸된다. 하지만이 지역 변수의 파괴는하지만, 실제 객체는 메모리를 멀리하지 않습니다. 이러한는 스팸으로 분류 될 것이며, 더 이상 활성 개체를 참조하지입니다.

그것은 거대한 메모리에 수많은 객체를 살아 GC가 정확하게 라이브 객체와 쓰레기 객체로 나누어 이러한 개체를 표시 할 필요가 전에. 이 과정이 덜 표시되면, 우리는 다음을 기다릴 수 GC, 마크 재활용, 이것은 GC의 효율성에 영향을 미칠 것입니다. 또한 잘못된 마크, 정상적인 라이브 개체가 스팸으로 표시되지 않습니다. 객체되면 정상적인 생존 복구는 다양한 프로그램의 붕괴로 이어질 수 있습니다.

마크에 사용할 수있는 두 가지 알고리즘이 있습니다 :

  • 참조 카운팅
  • 도달 가능성 분석

참조 카운팅

오브젝트 헤더 필드를 할당함으로써 참조 카운트는 오브젝트의 레퍼런스 카운트가 저장된다. 객체가 다른 객체에 의해 참조되면 횟수가 증가한다. 이것이 실패하면 참조 횟수가 감소합니다. 참조 횟수 값이 개체가 더 이상 참조 나타냅니다 때 복구 할 수 있습니다.

참조 카운팅

때 상기도 str카운트 값 힙에 객체 참조. str변경 null개체가 더 이상 참조 할 때 중, 카운트 값은 1 씩 감소하지 않습니다. 이 때, 객체가 될 수있다 GC회복되었다.

단지, 카운트 값을 카운트 참조하면,이 프로세스는보다 효율적이며, 달성 비교적 간단하다. 그러나 객체 순환 참조의 문제가 해결되지, 매우 심각한 문제가있는 것입니다.

레퍼런스 카운팅 -1

그림에서 볼 수있는, a, b더 이상 하나 계산 선도, 힙 객체를 참조하지 않습니다. 이 경우 서로에 대해 두 개의 개체 내부 레퍼런스가 있고, 카운트 값은, 0이없는 GC오브젝트를 복구하는 방법.

도달 가능성 분석

알고리즘은 처음에 규칙이 현재 활성있어서의 참조를 찾을 필요가이를 참조 할 것 GC Roots. 그런 다음 GC Roots루트 노드의 관점으로, 오브젝트 참조 그래프를 횡단 개체 생존 표시되어 (까지) 통과 할 수있을 것이며, 불필요한 물체와 나머지 오브젝트.

도달 가능성 분석

그 예 참고 참조 가 아닌 객체를.

이는 녹색 원형 기준의 존재가 개체 있지만, 도면에서 알 수 있지만, 이들 개체는 할 수 없기 때문에 GC Roots이송, 그것을 회수한다.

그것은으로 사용할 수있는 GC Roots활성 인용 된 참고 문헌을 포함하지만, 다음에 국한되지 :

  • 로컬 변수에있어서
  • 정적 변수, 상수
  • JNI 핸들
  • ....

어디 쓰레기

접촉의 시작을 기억 Java, 스택은 알고, 힙에 할당 된 개체 인스턴스는 방법은 지역 변수 스택에 있습니다. 실제로 JVM메모리 영역에 더 많은 미세하게 분쇄 나누어 져 있습니다 :

  • 더미
  • 방법 지구
  • VM 스택
  • 네이티브 메소드 스택
  • 프로그램 카운터

JVM 런타임 메모리 구역

같이, 우리의 기억은 스레드로 분할되고 스레드는 개인 영역을 공유 할 수 있습니다. 방법은 스레드 스택 영역과 공유 영역, 두 부분을 차지하고있는 JVM메모리의 대부분을, 나머지 세 개의 스레드 다이로, 자동으로됩니다, 스레드와 동생을 준수 할 것입니다 JVM회복되었다.

더미

힙이 가장 익숙한 영역, 거의 모든 개체 인스턴스가 여기에 태어난 것이어야한다, 일반적으로 최대 메모리의 영역을 차지 단순히 가상 머신입니다 JVM빅 브라더의 메모리. 힙 내부 메모리에만, 현재 세대 알고리즘은 세대 힙에 기초하는 간단한 것이 아니다 다른 목적은 서로 다른 영역에 위치한다. 이것은 우리가 아래에서 다시 자세히 이해하는 무언가이다.

방법 지구

정보 클래스 정보를 저장합니다 지구 방법을 가상, 상수, 정적 변수, 바이트 코드에로드 된, 힙이 메소드 영역으로 공식 정보를 객체, 당신은 그것을 바로 만들 수 있습니다.

스택

VM 스택 스택 프레임은 일련의 스택으로 구성되어, 각각의 스택 프레임이 방법의 실제 나타내는, 그것은 스택 프레임 내의 로컬 변수 테이블에있어서, 상기 방법은 게이트 정보 및 다른 오퍼랜드 스택에 저장한다. 당신이 메소드를 호출 할 때마다,이 스택 스택 프레임, 실행 종료, 스택에 넣어지게된다.

네이티브 메소드 스택 및 가상 머신이 더 유사 스택, 가장 큰 차이점은 가상 머신 스택 실행 Java방법, 네이티브 메소드 스택이 수행하는 데 사용되는 동안 Native서비스의 방법을. 다음 방법은 네이티브 메소드 스택에서 실행됩니다.

public static native void arraycopy(Object src,  int  srcPos,
                                    Object dest, int destPos,
                                    int length);
复制代码

프로그램 카운터

프로그램은 몇 계산기는이 지역의이 부분이 가장 작은 의해 점유라고 할 수 있지만, 기능이 매우 중요합니다. 컴파일러를 통해 자바 소스 코드는 바이트 코드되고, 다음 JVM을 실행 한 후로드, 지시어가 될 것이며, 프로그램 카운터의 작품은 현재 명령 실행 스레드를 알려줄 필요하다. 그래서 쓰레드 스위치가 발생하더라도 복구를 기다리는 동안, 현재의 thread가 여전히 다음 명령어를 알고 실행합니다.

어떻게 재활용

현재 주류 GC 알고리즘은 세 가지 유형으로 구분된다 :

  • 마크 - 스윕 알고리즘
  • 복제 알고리즘
  • 마크 - 정렬 알고리즘을

마크 - 스윕 알고리즘

이 알고리즘은 가장 기본적이고 가장 쉽게 달성 중 하나이며, 주요 구현 단계는 두 단계로 나누어집니다 : 표시, 분명.

  • 태그 : 위의 GC Roots객체 플래그까지.
  • 지우기 : 청소 표시되지 않은 객체 .

화상 20,191,214,114,722,060

PS :이지도는 아 그릴 정말 어렵다. . . .

이 알고리즘은 힙 공간을 깨끗이 할 수 있지만, 복구 후 볼뿐만 아니라, 많이 가질 수있는 공간 파편을 . 이 새로운 객체가 힙의 남은 용량을 기준으로 계산됩니다 이어질 것, 외모가 실제 할당 프로세스가 가상 머신 인식에 메모리가 부족의 결과로, 어떤 연속 메모리가 없기 때문에, 할당 할 수 있지만, 그들은 다시 불 수 밖에 없었다 GC.

여기에 당신은 아마 개체 연속 메모리 블록을 할당해야하는 이유, 의심이 있습니까?

여기에 R 하나님을 인용 @RednaxelaFX의 대답을.

화상 20,191,214,141,247,453

또한이 알고리즘의 부족이있다 : 클리어 표지 효율이 비교적 낮다. 이것은 심지어 유도 할 수있는 GC정상적인 프로그램에 영향을 미치는, 너무 오래 걸릴.

복제 알고리즘

효율성 문제를 해결하기 위해, 복제 알고리즘을 탄생. 이 알고리즘은 사용 가능한 메모리는 각각 하나의 메모리의 일부가 사용되는 경우, 트리거가 사용을 2 등분 GC한 후 한 번 메모리 정리 사용되고 넣고, 다른 부분에 복제하기 위해 개체의 생존됩니다 .

화상 20,191,214,144,413,235

각 연산에 대한 알고리즘은 메모리의 반만을 필요로 GC새로운 객체 메모리 할당은 메모리가 간단하고 효율적인 동작을 달성하기 위해 할당되는 경우에만, 상기 스택 포인터의 최고 이동도 복구 후에 어떤 우주 쓰레기가있다. 그러나,이 알고리즘은 메모리 공간의 유휴 절반은 공간 효율이 높지 않다입니다.

PS : 시간에 대한 복제 알고리즘 공간, 두 사람은 모두를 가질 수 없습니다

또한 개체의 생존은 알고리즘의 복제 효율에 영향을 미칠 것입니다. 객체가 바로 살아있는 객체의 작은 금액을 이동해야하는 죽음에 대한 원시 저녁, 대부분의 경우, 당신은 대부분의 공간을 확보 할 수 있습니다. 그러나 개체 생존율 빈번한 트리거가 발생할 수 회복 후 더욱 복사 작업, 또한 별도의 메모리를 필요로하는 높은 경우 GC.

정렬 알고리즘 -이 오랜 개체의 생존을 위해, 우리는 마크를 사용할 필요가있다.

마크 - 정렬 알고리즘을

마크 - 정렬 알고리즘을 표시 할 수 있습니다 - 지우기 알고리즘의 버전이 우주 쓰레기의 문제로 인해 삭제 향상 개선되었다. 이 알고리즘은 두 단계로 나누어 져 있습니다 :

  • 태그 : 또한 의해 GC Roots살아있는 객체를 표시.
  • 마무리 : 끝 라이브 움직이는 물체를 첫 번째 종류의 메모리 주소, 직접 메모리 정리보다 경계의 다음 말에 따라.

화상 20,191,214,152,625,150

정렬 알고리즘 마크 해결하기 위해 - - 우주 쓰레기, 전체 메모리 공간도 전체 사용의 청소 알고리즘을하지만,이 문제는 매우 효율적인 알고리즘없는 마크가 있지만. 마크 비교 - 스위프 알고리즘, 마크 - 스윕 알고리즘 - 정렬 알고리즘은 더 많은 공정이 마무리 증가보다, 알고리즘의 효율도 낮은 마크보다 그래서.

세대 수집 알고리즘

세 가지 유형의 위의가에서 GC알고리즘을 볼 수 있고, 시간과 공간 효율 것도 상대적으로 완벽한 알고리즘 없다, 우리가 할 단지 수있는 메모리의 사용되지 않는 영역에 적용 할 다양한 알고리즘의 종합 이용의 특징이다.

다른 개체의 생존 기간 분할 메모리 영역에 따라 현재 상용 가상 머신은, 일반적으로 새로운 세대, 이전 시대로 나누었다. 새로운 개체가 새로운 세대에 우선 순위를 부여합니다 일반적으로 할당, 생존 시간이 특정 임계 값보다 큰 경우 오브젝트 후 새로운 세대, 그것은 이전 시대로 이동합니다. 단명 객체의 새로운 세대가 유령이다, 나이는 객체 씨 수명이다.

모든 새로운 세대의 GC개체 후에는 복제 알고리즘에 더 적합, 대량으로 재활용 할 수 있습니다 만 실제 물체의 작은 금액을 복사하는 비용을 지불해야합니다. 여기에 메모리가 분할되고 있지 1 : 1 개 부문, 기본 8을 따릅니다 : 1 : 1로 나누어 Eden두 개의 Survivor공간. 각각의 사용 EdenA의 Survivor공간, 그래서 우리는 단지 메모리 공간의 10 %를 유휴. 그러나 때마다 우리는 당신이 메모리 할당을 확보 나이에 의존해야하는 경우에 생존과 객체의 회복 10 % 미만입니다을 보장 할 수 없다. Survivor공간이 남아있는 살아있는 개체를 저장하지 않습니다 이러한 개체는 기존 바이너리 년을 보장하기 위해 분배를 통해 이동합니다.

스윕이나 마크 - - 정렬 알고리즘 올드의 생존 개체가 특히 높은 것, 그리고 여분의 공간을 할당 보장은 없습니다, 그것은 복제 알고리즘에 적합하지 않습니다,이 마크를 사용하는 것이 필요하다.

그냥 이야기

최근 년 최종 시험 시간은 다시 배우기에 "자바 가상 머신 깊이에서"저우 밍을 포착했다. 이 책을보고 처음을 기억 내용의 대부분이 읽을 수없는, 곧 읽고 잊어 버려. 그리고 잠시 후, 마지막으로보다 더, 다시 시간을 책을 데리러, 우리는 절반 이상 약간을 볼 수 있었다. 최근 일부 작은 채팅과의 협력 및 그들은 모두이 책을 배우고 읽어 발견은 JVM,이 책은 정말 하나님의 책이라고 말해야한다. 최근 "깊이있는 자바 가상 머신,"곧 판매하는 제 3 판은 거의 필요 파트너가 시작 간주 될 수있다.

음, GC메커니즘, 여기에 요약 다음 JVM의 공통의 약의 얘기하자하는 GC콜렉터.

도움말 링크

뿌리 GC 자바 가상 머신 04 상세 ---- GC 알고리즘의 유형 에 대한 심층적 인 자바 가상 머신

통역 프로그램 및 점점 매일 건조 푸시 : 나는 대중 번호의 관심을 환영합니다. 내 주제 내용에 관심이 있다면, 당신은 내 블로그에 집중할 수 : studyidea.cn를

.png를 다른 플랫폼

추천

출처juejin.im/post/5df786c56fb9a0161e592da4