복사 알고리즘
먼저 복사 알고리즘의 실습을 살펴보겠습니다. 복사 알고리즘은 어느 시점에서나 동적으로 할당된 모든 객체를 한 간격으로만 할당할 수 있습니다. 간격(활성 간격이라고 함)과 다른 간격(유휴 간격이라고 함)은 유휴 상태입니다.
유효 메모리 공간이 고갈되면 JVM은 프로그램을 일시 중지하고 복사 알고리즘 GC 스레드를 시작합니다. 다음으로, GC 스레드는 활성 간격에서 남아 있는 모든 객체를 여유 간격에 복사하고 메모리 주소에 따라 엄격하게 정렬합니다. 동시에 GC 스레드는 살아남은 객체의 메모리 참조 주소를 지점으로 업데이트합니다. 새로운 메모리 주소로.
이번에는 Free Interval이 Active Interval로 바뀌었고 모든 Garbage 객체는 현재 Free Interval인 원래 Active Interval에 그대로 남아있습니다. 실제로 활성 간격을 공간 간격으로 변환하면 가비지 개체가 한꺼번에 재활용되었습니다.
복잡해 보이죠?
사실 이전 장의 기초를 바탕으로 이 알고리즘을 이해하는 데는 많은 노력이 필요하지 않을 것이라고 믿습니다. LZ는 문제를 설명하기 위해 아래와 같이 그림을 그립니다.
사실 이 그림은 여전히 이전 장의 예시이지만, 이제 복사 알고리즘에 의해 메모리가 두 부분으로 나누어지는 것을 살펴보겠습니다. 복사 알고리즘의 스레드 처리 이후 두 영역의 모습은 아래와 같습니다.
지금 막 개체 1, 4가 지워진 반면, 개체 2, 3, 5, 6이 규칙적으로 여유 간격 내에 있는 것을 볼 수 있습니다. 현재 활동 범위. 이때 왼쪽 절반은 유휴 간격이 되었습니다. 다음 GC 이후에는 왼쪽 절반이 다시 활성 간격이 될 것이라고 상상하는 것은 어렵지 않습니다.
분명히 복사 알고리즘은 마크/클리어 알고리즘의 혼란스러운 메모리 레이아웃의 단점을 보완합니다. 그러나 동시에 그 단점도 매우 분명합니다.
1. 메모리의 절반을 낭비합니다. 정말 끔찍합니다.
2. 개체의 생존율이 매우 높으면 조금 극단적으로 갈 수 있습니다. 100% 생존을 가정하면 모든 개체를 복사하고 모든 참조 주소를 재설정해야 합니다. 이 작품을 복사하는 데 소요되는 시간은 개체 생존율이 일정 수준에 도달하면 무시할 수 없게 됩니다.
그래서 복제 알고리즘을 사용하려면 최소한 개체의 생존율이 매우 낮아야 한다는 것을 위의 설명에서 알 수 있듯이, 가장 중요한 것은 50의 낭비를 극복해야 한다는 것입니다. 메모리의 %.
표시/조합 알고리즘
표시/조합 알고리즘은 표시/삭제 알고리즘과 매우 유사하며 표시와 정렬의 두 단계로 나뉩니다. 다음으로 LZ는 이 두 단계에서 수행된 작업을 소개합니다.
표시: 첫 번째 단계는 GC 루트를 순회한 다음 살아남은 객체를 표시하는 표시/지우기 알고리즘과 정확히 동일합니다.
정리: 살아남은 모든 개체를 이동하여 메모리 주소 순으로 정렬한 다음, 마지막 메모리 주소 이후의 모든 메모리를 재활용합니다. 따라서 두 번째 단계를 마무리 단계라고 합니다.
GC 전후의 다이어그램은 활성 간격과 여유 간격 사이에 차이가 없다는 점을 제외하면 복사 알고리즘의 다이어그램과 매우 유사하며 프로세스는 마크/클리어 알고리즘과 매우 유사합니다. 아래와 같은 레이아웃으로 GC 전 메모리의 객체 상태를 확인합니다.
이 그림은 메모리 규칙의 연속적인 배열을 용이하게 하기 위해 LZ가 메모리를 나타내는 직사각형을 추가한 것을 제외하면 실제로 mark/clear 알고리즘과 완전히 동일합니다. 영역. 이때 GC 스레드가 작동하기 시작하면 마킹 단계가 즉시 시작됩니다. 이 단계는 마킹/클리어 알고리즘의 마킹 단계와 동일하며 마킹 단계 이후의 객체 상태를 살펴보면 아래와 같습니다.
설명할 것이 없습니다. 다음은 정리 단계입니다. 아래와 같이 정렬 단계가 완료된 후 메모리 레이아웃이 어떻게 보이는지 살펴보겠습니다.
보시다시피 표시된 생존 개체는 메모리 주소에 따라 순서대로 정리 및 배열되고, 표시되지 않은 메모리는 정리됩니다. 이러한 방식으로 새 객체에 메모리를 할당해야 할 때 JVM은 메모리의 시작 주소만 보유하면 되며 이는 사용 가능한 목록을 유지하는 것보다 훨씬 적은 오버헤드입니다.
마크/정렬 알고리즘이 마크/클리어 알고리즘의 메모리 영역 단점을 보완할 수 있을 뿐만 아니라 복사 알고리즘의 메모리를 절반으로 줄이는 데 드는 높은 비용을 제거할 수 있다는 것을 어렵지 않게 볼 수 있습니다. 일석이조, 일석이조, 일석이조라고 할 수 있다. . . . 한 여자와 두 남자?
그러나 모든 알고리즘에는 단점이 있습니다. 표시/구성 알고리즘의 유일한 단점은 살아남은 모든 객체를 표시해야 할 뿐만 아니라 살아남은 모든 객체의 참조 주소를 정렬해야 한다는 것입니다. . 효율성 측면에서 표시/조합 알고리즘은 복사 알고리즘보다 낮습니다.
알고리즘 요약
여기서 LZ는 세 가지 알고리즘의 공통점과 각각의 장단점을 요약하여 비교해 볼 수 있도록 함으로써 더욱 명확해질 것입니다.
두 사람의 주요 공통점은 다음 두 가지입니다.
1. 세 가지 알고리즘은 모두 루트 검색 알고리즘을 기반으로 하여 객체를 재활용해야 하는지 여부를 결정합니다. 루트 검색 알고리즘의 정상적인 작동을 뒷받침하는 이론적 근거는 문법의 변수 범위 관련 내용입니다. 따라서 메모리 누수를 방지하는 가장 근본적인 방법은 메모리 관리에 대한 이전 장에서 언급한 C/C++ 스타일의 메모리 관리 방법을 사용하는 대신 변수 범위를 마스터하는 것입니다.
2. GC 스레드가 시작되거나 GC 프로세스가 시작되면 애플리케이션을 일시 중지해야 합니다(세계를 중지).
LZ는 다음 사항에 따라 차이점을 알려드립니다. (> 전자가 후자보다 낫다는 의미, = 둘 다 동일한 효과가 있음을 의미)
효율성: 복사 알고리즘 > 표시/정리 알고리즘 > 표시/삭제 알고리즘 (여기서의 효율성은 단순한 비교입니다. 시간 복잡도가 높으므로 꼭 그렇지는 않을 수도 있습니다.)
메모리 깔끔함: 복사 알고리즘 = 표시/정리 알고리즘>
메모리 활용: [b] 표시/한 부씩 정렬 알고리즘 = 표시/비우기 알고리즘 > [/b]
마크/클리어 알고리즘은 상대적으로 뒤떨어진 알고리즘이라는 것을 알 수 있지만, 후자의 두 알고리즘은 "울고 있을 때 우물 파는 사람을 잊지 마세요"라는 말처럼 이를 기반으로 구축되었습니다. 문제가 발생하므로 이전의 마크/스윕 알고리즘을 잊어서는 안 됩니다. 또한 어느 시점에서는 마크/스윕이 작동하게 됩니다.
결론
이제 세 가지 알고리즘에 대해 명확하게 이해했습니다. 효율성 측면에서는 복제 알고리즘이 가장 우수하지만 메모리를 너무 많이 낭비한다는 것을 알 수 있습니다. 위에서 언급한 세 가지 지표를 고려하면 마킹/정리 알고리즘은 상대적으로 원활하지만 효율성은 여전히 만족스럽지 않습니다. 메모리.
최적의 알고리즘은 없을까?
물론 그렇지 않습니다. 세상은 공평하고 모든 것에는 양면이 있습니다. 아름답고, 열심히 일하고, 부유하고, 합리적이고, 올바른 성격, 올바른 가족 배경, 키, 외모를 가진 사람을 어떻게 찾을 수 있습니까? 등 잠깐만요, 적합한 여자가 있나요? 설사 찾아내더라도 이 여자가 절대 만족하지 못할 것이 하나쯤은 있을 것이다. 즉, 그녀는 LZ처럼 열심히 일하는 유인원 친구들 중 그 누구와도 사랑에 빠지지 않을 것이다. 당신이 LZ보다 훨씬 낫다고 말하고 싶습니까? 그렇다면 LZ는 Gao Fushuai가 기술 기사를 읽으려고 컴퓨터 앞에 기어 가지 않을 것이라고 말하고 싶습니다.
하지만 고대인들은 아내를 찾을 때 가장 좋은 사람을 찾을 필요가 없지만 가장 적합한 사람을 찾을 필요가 있다고 말했습니다. 이 문장을 듣고 나는 즉시 세상이 많다는 것을 느꼈습니다. 더 나은.
알고리즘은 같습니다. 최고의 알고리즘은 없고 가장 적합한 알고리즘만 있습니다.
이 세 가지 알고리즘에는 나름의 결함이 있기 때문에 전문가들은 당연히 이런 일이 발생하도록 허용하지 않을 것입니다. 따라서 전문가들은 당근과 양배추가 각기 다른 선호도를 갖는 원리와 마찬가지로 물체의 다양한 특성에 따라 서로 다른 알고리즘을 사용할 수 있다고 제안했습니다. 그래서 기적이 일어났고, 전문가들은 마침내 GC 알고리즘 중 신 수준의 알고리즘, 즉 세대별 수집 알고리즘을 찾아냈습니다.
이 신 수준의 알고리즘이 어떻게 처리되는지에 대해서는 다음 장에서 모든 원숭이 친구들과 논의할 것입니다.
위 내용은 JVM 메모리 관리 ------ GC 알고리즘(복사 알고리즘 및 마킹/조합 알고리즘)에 대한 내용이며, 자세한 내용은 PHP 중국어 홈페이지(www.php)를 참고하시기 바랍니다. .cn)!