JVM에는 4 가지 일반적인 쓰레기 수집 알고리즘이 있습니다.
마크 클리어링 알고리즘 (Mark-Sweep);
복사 알고리즘 (복사);
마크 컴팩트;
세대 수집;
하나씩 소개합시다.
1. 마크 클리어링 알고리즘 (Mark-Sweep)
이것은 가장 기본적인 쓰레기 수집 알고리즘입니다. 알고리즘은 "마킹"과 "청소"의 두 단계로 나뉩니다. 첫째, 재활용 해야하는 모든 객체가 표시되고, 표시된 모든 객체는 마킹이 완료된 후에 균일하게 재활용됩니다. 주요 단점은 두 가지입니다. 하나는 효율성 문제이며, 마킹 및 청소 효율은 높지 않습니다. 다른 하나는 공간 문제이며, 마킹이 지워지면 많은 불연속 메모리 조각이 생성됩니다. 공간 조각이 너무 많으면 큰 물체를 할당 할 때 불충분 한 넓은 연속 공간을 유발할 수 있으며 다른 쓰레기 수집 조치는 미리 트리거되어야합니다.
마크 클리어 알고리즘 다이어그램
2. 알고리즘 복사 (복사)
"복사"알고리즘으로 효율성 문제를 해결하기 위해 사용 가능한 메모리를 동일한 크기의 두 블록으로 나눕니다. 한 번에 한 조각 만 사용하십시오. 한 조각의 공간이 소비되면 아직 서식을 제공하는 물체를 다른 조각에 복사 한 다음 새로 사용 된 메모리 공간을 한 번에 정리하십시오. 이렇게하면 매번 조각 중 하나를 재활용 할 수 있으므로 메모리를 할당 할 때 메모리 조각화 및 기타 복잡한 상황을 고려할 필요가 없습니다. 간단한 구현 및 효율적인 운영. 그러나이 알고리즘의 비용은 메모리를 원본의 절반으로 줄이는 것입니다. 실제로, 새로운 세대의 물체의 98%가 살고 죽으므로 메모리를 1 : 1 비율로 나눌 필요는 없지만 에덴 공간과 생존자 공간 중 하나를 사용하여 메모리를 더 큰 에덴 공간과 2 개의 작은 생존자 공간으로 나눌 필요가 없습니다. 재활용되면 에덴과 생존자의 아직 서식을하는 물체를 한 번에 다른 Suivivor에게 복사하고 마침내 에덴과 새로 사용 된 생존자의 공간을 정리하십시오.
알고리즘 다이어그램을 복사하십시오
3. Mark-Compact
객체 생존율이 높으면 복제 및 수집 알고리즘은 더 많은 복제 작업을 수행해야하며 효율이 낮아집니다. 더 중요한 것은 공간의 50%를 낭비하지 않으려면 반 구역 메모리의 모든 물체가 100% 살아있는 극단적 인 상황을 처리 할 수있는 추가 공간이 있어야 하므로이 알고리즘은 노인에서 직접 사용할 수 없습니다.
따라서 사람들은 또 다른 "마크 컴팩트"알고리즘을 제안했습니다. 노인의 물체는 생존주기가 길기 때문에 일부 사람들은 "마크 컴팩트"알고리즘을 제안했습니다. 마킹 프로세스는 "마크 청소"와 동일하지만 죽은 물체를 지우는 동안 살아남은 물체가 정렬되어 단편화 된 공간을 줄일 수 있습니다.
마크 조직 알고리즘 다이어그램
4. 세대 컬렉션
현재 상용 가상 머신 용 쓰레기 수집은 "Generational Collection"알고리즘을 채택합니다. 이 알고리즘에는 새로운 아이디어가 없지만 물체의 다른 생존주기에 따라 메모리가 여러 조각으로 나뉩니다. 일반적으로 Java 힙은 새로운 세대와 구식으로 나뉘어 각 세대의 특성에 따라 가장 적합한 수집 알고리즘을 사용할 수 있습니다. 새로운 세대에서는 쓰레기 수집이 수집 될 때마다 많은 수의 물체가 죽었고 적은 수의 물체 만 살아남습니다. 그런 다음 사본 알고리즘을 사용하면 소량의 사본 비용으로 컬렉션을 완료 할 수 있습니다. 노인에서는 물체의 생존율이 높고 사이클이 길기 때문에 "Mark-tidy"또는 "mark-clear"알고리즘은 그것을 재활용하는 데 사용됩니다.
JVM의 일반적인 쓰레기 수집 알고리즘에 대한 위의 소개는 내가 공유하는 모든 컨텐츠입니다. 나는 당신이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.