GC (Garbage Collection)와 관련하여 많은 사람들이 자연스럽게 Java와 연관시킬 것입니다. Java에서 프로그래머는 동적 메모리 할당 및 쓰레기 수집에 신경 쓰지 않아도되며,이 모든 것은 JVM에 맡겨집니다.
이름에서 알 수 있듯이 쓰레기 수집은 쓰레기가 차지하는 공간을 자유롭게하는 것입니다. Java에서는 어떤 종류의 물체가 "쓰레기"로 간주됩니까? 따라서 일부 물체가 쓰레기로 결정되면 재활용 (무료 공간)에 어떤 전략을 사용해야합니까? 현재 상업용 가상 머신의 전형적인 쓰레기 수집가는 무엇입니까? 이러한 문제를 하나씩 논의 해 봅시다. 이 기사의 디렉토리 개요는 다음과 같습니다.
물체가 "쓰레기"인지 확인하는 방법은 무엇입니까?
전형적인 쓰레기 수집 알고리즘 전형적인 쓰레기 수집기
1. 물체가 "쓰레기"인지 확인하는 방법은 무엇입니까?
이 섹션에서는 먼저 가장 기본적인 질문을 이해합니다. 물체가 "쓰레기"라고 판단하면? 쓰레기 수집가의 임무는 새로운 물체가 사용하기 위해 쓰레기 물체가 차지하는 공간을 재활용하는 것이기 때문에, 쓰레기 수집기는 물체가 "쓰레기"라고 어떻게 결정합니까? 즉, 객체를 재활용 할 수 있다고 판단하는 방법.
Java에서는 참조를 통해 객체와 관련이 있습니다. 즉, 객체를 작동하려면 참조를 통해 수행해야합니다. 그런 다음 쉬운 방법은 참조 계수로 물체를 재활용 할 수 있는지 판단하는 것이 분명합니다. 일반성을 잃지 않고 객체에 관련된 참조가없는 경우, 객체가 기본적으로 다른 곳에서 사용되지 않을 가능성이없고 객체가 재활용 가능한 객체가된다는 것을 의미합니다. 이 방법은 참조 계산 방법이됩니다.
이 방법은 간단한 구현과 고효율을 특징으로하지만 원형 참조 문제를 해결할 수는 없으므로이 방법은 Java에서 채택되지 않습니다 (Python은 참조 계수 방법을 사용합니다). 다음 코드를보십시오.
public class main {public static void main (String [] args) {myObject Object1 = new myObject (); myObject Object2 = new myObject (); Object1.Object = Object2; Object2.Object = Object1; Object1 = null; Object2 = null; }} class myObject {public Object 객체 = null;}마지막 두 문장은 Object1과 Object2를 NULL에 할당합니다. 즉, Object1과 Object2가 더 이상 접근 할 수 없지만, 서로를 참조하기 때문에 참조 수는 0이 아니기 때문에 쓰레기 수집기는 절대 재활용되지 않습니다.
이 문제를 해결하기 위해 접근성 분석 방법이 Java에서 채택됩니다. 이 방법의 기본 아이디어는 일련의 "GC 루트"객체를 시작점으로 검색하는 것입니다. "GC 루트"와 물체 사이에 접근 가능한 경로가 없으면 물체는 도달 할 수 없다고합니다. 그러나 도달 할 수없는 것으로 판단 된 물체가 반드시 재활용 가능한 물체가 될 필요는 없다는 점에 유의해야합니다. 도달 할 수없는 것으로 판단되는 물체는 재활용 가능한 물체가되기 위해 적어도 두 개의 마킹 프로세스를 거쳐야합니다. 이 두 가지 마킹 프로세스에서 재활용 가능한 물체가 될 가능성이 여전히 없다면 기본적으로 재활용 가능한 물체가됩니다.
접근성 분석 방법이 어떻게 작동하는지에 관해서는 아직 명확하게 이해하지 못했습니다. 친구가 더 명확하다면 조언을 해주세요.
아래의 예를 보겠습니다.
개체 aobj = new Object (); Object bobj = new Object (); object cobj = new Object (); aobj = bobj; aobj = cobj; cobj = null; aobj = null;
어떤 라인이 객체를 재활용 할 수 있습니까? 7 행의 코드는 객체가 재활용 가능한 객체가되게합니다. 독자들이 스스로 생각하는 것이 왜 맡겨 졌는지에 관해서.
다른 예를 살펴 보겠습니다.
String str = new String ( "hello"); softreference <string> sr = new softreference <string> (새 문자열 ( "java")); 약점 <String> wr = new 약점 <String> (새 문자열 ( "World"));
이 세 문장 중 문자열 객체를 재활용 할 수있는 것은 무엇입니까? 문장 2와 3 및 문장 2는 메모리가 불충분 할 때 문자열 객체를 재활용 가능한 객체로 결정하고 세 번째 문장에서 문자열 객체는 어떤 경우에도 재활용 가능한 객체로 결정됩니다.
마지막으로, 객체가 일반적으로 발생하는 재활용 가능한 물체로 판단되는 일반적인 상황을 요약하겠습니다.
1) NULL에 대한 참조 값을 표시하거나 다음 코드와 같은 새로운 객체에 대한 객체를 이미 지적한 참조를 가리킨다.
Object obj = new Object (); obj = null; object obj1 = new Object (); object obj2 = new Object (); obj1 = obj2;
2) 다음 코드와 같이 지적 된 개체에 대한 로컬 참조 :
void fun () {...... for (int i = 0; i <10; i ++) {object obj = new Object (); System.out.println (obj.getClass ()); }}루프가 실행될 때마다 생성 된 객체 객체는 재활용 가능한 객체가됩니다.
3) 약한 참조 만 다음과 같은 객체와 관련이 있습니다.
약점 <string> wr = new 약점 <string> (새 문자열 ( "world"));
2. 일반적인 쓰레기 수집 알고리즘
재활용 할 수있는 쓰레기를 결정한 후에는 쓰레기 수집가가 쓰레기 수집을 시작하는 것이지만 관련된 문제는 다음과 같습니다. 쓰레기를 효율적으로 수집하는 방법. Java Virtual Machine 사양은 쓰레기 수집기를 구현하는 방법에 대한 명확한 규정을 제시하지 않기 때문에 각 제조업체의 가상 기계는 다양한 방식으로 쓰레기 수집기를 구현할 수 있으므로 여러 일반적인 쓰레기 수집 알고리즘의 핵심 아이디어 만 여기에서 논의됩니다.
1. 마크-스위프 (마크 클리어) 알고리즘
이것은 가장 기본적인 쓰레기 수집 알고리즘입니다. 그것이 가장 기본적인 것으로 알려진 이유는 구현하기가 가장 쉽고 가장 간단한 아이디어이기 때문입니다. 마크 클리어링 알고리즘은 마킹 단계와 청소 단계의 두 단계로 나뉩니다. 마킹 단계의 작업은 재활용 해야하는 모든 물체를 표시하는 것이며, 청소 단계는 표시된 물체가 차지하는 공간을 재활용하는 것입니다. 특정 프로세스는 아래 그림에 나와 있습니다.
그림에서 마크 클리어링 알고리즘을 구현하기가 더 쉽다는 것을 쉽게 볼 수 있지만 메모리 조각을 쉽게 생성하는 것이 심각한 문제가 있습니다. 너무 많은 조각이 후속 프로세스에서 큰 물체에 대한 공간을 할당 할 때 충분한 공간을 찾을 수없고 새로운 쓰레기 수집 조치를 미리 트리거 할 수 없습니다.
2. 복사 (복사) 알고리즘
Mark-Sweep 알고리즘의 단점을 해결하기 위해 복사 알고리즘이 제안되었습니다. 사용 가능한 메모리를 한 번에 하나의 조각 만 사용하여 용량별로 동일한 크기의 두 조각으로 나눕니다. 이 메모리 조각을 사용하면 여전히 살아있는 객체를 다른 조각으로 복사 한 다음 사용한 메모리 공간을 한 번에 정리하여 메모리 조각화 문제가 발생하지 않도록하십시오. 특정 프로세스는 아래 그림에 나와 있습니다.
이 알고리즘은 구현하기 쉽고 실행하기에 효율적이며 메모리 조각화를 쉽게 생성하지 않지만 사용될 수있는 메모리가 원래의 메모리의 절반으로 축소되기 때문에 메모리 공간을 사용하는 데 비용이 많이 듭니다.
분명히, 복사 알고리즘의 효율성은 생존 객체의 수와 관련이 있습니다. 살아남은 물체가 많이있는 경우 복사 알고리즘의 효율성이 크게 줄어 듭니다.
3. 마크 컴팩트 (마크-콜레이션) 알고리즘
복사 알고리즘의 단점을 해결하고 메모리 공간을 최대한 활용하기 위해 마크 컴팩트 알고리즘이 제안됩니다. 알고리즘은 Mark-Sweep과 동일하지만 마크를 완료 한 후에는 재활용 가능한 물체를 직접 정리하지는 않지만 모든 살아있는 물체를 한쪽 끝으로 이동 한 다음 끝 경계 외부의 메모리를 정리합니다. 특정 프로세스는 아래 그림에 나와 있습니다.
4. 세대 수집 알고리즘
Generation Collection 알고리즘은 현재 대부분의 JVM 쓰레기 수집기가 사용합니다. 그것의 핵심 아이디어는 물체 생존의 수명주기에 따라 메모리를 여러 다른 영역으로 나누는 것입니다. 일반적으로 힙 영역은 구세대와 젊은 세대로 나뉩니다. 구식의 특징은 쓰레기를 수집 할 때마다 적은 수의 물체 만 재활용해야한다는 것입니다. 새로운 세대의 특징은 쓰레기를 수집 할 때마다 많은 수의 물체를 재활용해야한다는 것입니다. 그런 다음 가장 적합한 수집 알고리즘을 다른 세대의 특성에 따라 채택 할 수 있습니다.
현재 대부분의 쓰레기 수집가는 새로운 세대의 복사 알고리즘을 채택합니다. 신규 세대에서는 대부분의 물체가 쓰레기 수집을 수집 할 때마다 재활용해야하기 때문에 복사해야 할 작업의 수는 비교적 작지만 실제로는 새로운 세대의 공간이 1 : 1의 비율에 따라 분할되지 않음을 의미합니다. 일반적으로, 새로운 세대는 더 큰 에덴 공간과 2 개의 작은 생존자 공간으로 나뉩니다. 에덴 공간과 생존자 공간 중 하나가 사용될 때마다 재활용되면 에덴과 생존자의 아직 서식을하는 물체가 다른 생존자 공간에 복사되고 방금 사용 된 에덴과 생존자 공간이 청소됩니다.
노년은 적은 수의 객체 만 매번 재활용되기 때문에 Mark-Compact 알고리즘이 일반적으로 사용됩니다.
클래스 클래스, 상수, 메소드 설명 등을 저장하는 데 사용되는 Permanet Generation 인 Heap Area 외부에 다른 세대가 있습니다. 영구 생성의 재활용은 주로 상수와 쓸모없는 클래스의 두 부분을 재활용합니다.
3. 전형적인 쓰레기 수집가
쓰레기 수집 알고리즘은 메모리 재활용의 이론적 기초이며, 쓰레기 수집기는 메모리 재활용의 특정 구현입니다. 다음은 핫스팟 (JDK 7) 가상 머신에서 제공하는 여러 쓰레기 수집기에 대한 설명입니다. 사용자는 자신의 요구에 따라 각 시대에 사용되는 수집기를 결합 할 수 있습니다.
1. 서신/연쇄 오래
직렬/직렬 구형 수집가가 가장 기본적이고 오래된 수집가입니다. 단일 스레드 수집기이며 쓰레기 수집이있을 때 모든 사용자 스레드를 일시 중지해야합니다. 직렬 수집기는 복사 알고리즘을 사용하는 차세대 수집가이며, 직렬 오래된 수집기는 마크 컴팩트 알고리즘을 사용하여 구식 수집가입니다. 그것의 장점은 간단하고 효율적이지만, 단점은 사용자에게 일시 중지를 유발한다는 것입니다.
2. 파 나프
Parnew Collector는 쓰레기 수집에 여러 스레드를 사용하는 직렬 수집기의 멀티 스레드 버전입니다.
3. 평행 청소
Parallel Scavenge Collector는 새로운 세대의 멀티 스레드 수집기 (병렬 수집기)입니다. 재활용 중에 다른 사용자 스레드를 일시 중지 할 필요는 없습니다. 복사 알고리즘을 사용합니다. 이 수집가는 처음 두 수집가와 다릅니다. 주로 제어 처리량을 달성하는 것입니다.
4. 평행 한
Parallel Old는 멀티 스레딩 및 마크 컴팩트 알고리즘을 사용하는 Parally Scavenge Collector (Parallel Collector)의 이전 버전입니다.
5.CMS
CMS (현재 마크 스윕) 수집기는 가장 짧은 복구 일시 중지 시간을 얻기위한 수집가입니다. Mark-Sweep 알고리즘을 사용하는 동시 수집기입니다.
6.G1
G1 수집가는 오늘날의 수집가 기술 개발에서 가장 최첨단 성과입니다. 멀티 CPU 및 멀티 코어 환경을 최대한 활용할 수있는 서버 측 응용 프로그램의 수집가입니다. 따라서 평행하고 동시성 수집가이며 예측 가능한 일시 중지 시간 모델을 구축 할 수 있습니다.
메모리 할당에 대한 몇 가지 사항은 다음과 같습니다.
일반적인 방향으로, 객체의 메모리 할당은 힙에 할당됩니다. 물체는 주로 새로운 세대의 에덴 공간과 우주에서 할당되며 드문 경우에는 노년기에 직접 할당됩니다. 새로운 세대의 에덴 공간의 공간과 우주에서 공간이 충분하지 않으면 GC가 시작됩니다. GC가 수행되면 에덴 공간과 우주에서는 물체를 수용 할 수 있으며 에덴 공간과 우주에서 배치됩니다.
GC 과정에서 에덴 공간과 우주에서 생존 한 물체가 우주로 이동 한 다음 에덴 공간과 공간에서 청소됩니다. 공간으로 인해 청소 중에 물체를 저장하기에 충분할 수 없다면 물체를 노년층으로 이동시킵니다. GC 후에는 Eden 공간 및 공간이 사용됩니다. 다음에 GC가 될 때 생존 객체가 우주에서 복사되고 루프가 반복됩니다. 물체가 생존자 지역에서 GC를 한 번 탈출하면 물체의 나이가 1만큼 증가합니다. 기본적으로 물체가 15 세에 도달하면 노년기의 중년으로 이동합니다.
일반적으로, 큰 물체는 노년기까지 직접 할당됩니다. 소위 큰 물체는 많은 양의 연속 저장 공간이 필요한 객체를 나타냅니다. 가장 일반적인 유형의 큰 물체는 다음과 같은 큰 배열입니다.
바이트 [] 데이터 = 새로운 바이트 [4*1024*1024]
이 유형의 저장 공간은 일반적으로 노인에 직접 할당됩니다.
물론, 할당 규칙은 100% 고정되어 있지 않으며, 이는 현재 JVM의 쓰레기 수집기 조합과 관련 매개 변수가 현재 사용되고 있는지에 따라 다릅니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.