이 글의 내용은 Java에서 JVM 메모리를 할당하고 관리하는 방법을 소개하는 것인가요? 모든 사람이 JVM의 가비지 수집 알고리즘과 JVM의 메모리 할당 메커니즘을 이해할 수 있도록 하세요. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.
1. 가비지 수집 알고리즘
JVM의 메모리 할당 메커니즘
가비지 수집 알고리즘에는 마크 스윕 알고리즘, 마크 보완 알고리즘 및 복사 알고리즘이 포함됩니다. 공간, 세대별 수집 알고리즘은 신세대와 구세대로 나뉘는데, 신세대는 복사 알고리즘을 사용하고 구세대는 마크 대조 알고리즘을 사용한다. 가비지 수집 알고리즘의 구체적인 아이디어.
마크 클리어 알고리즘:
마크 클리어 알고리즘은 마킹과 클리어의 두 단계로 나누어집니다. 먼저 재활용이 필요한 메모리 공간을 마킹하고 마킹이 완료되면 마킹된 모든 객체를 재활용합니다. 균일하게. 여기에는 두 가지 주요 이유가 있습니다. 1. 표시 및 삭제 효율성이 높지 않습니다. 2. 객체 공간을 비운 후 불연속적인 메모리 조각이 대량 생성되므로 대형 객체(연속 메모리를 많이 필요로 하는 객체)를 재할당할 때 메모리 부족으로 인해 사전에 가비지 수집이 시작됩니다. 재활용 과정은 아래 그림과 같습니다.
복사 알고리즘
복사 알고리즘은 메모리 용량을 두 개의 동일한 블록으로 나누고 매번 하나의 메모리 조각을 사용합니다. 이 메모리 조각이 모두 사용되면 이 메모리 조각에 살아남는 개체가 있습니다. 다른 메모리 블록에 복사된 후 이 메모리 공간을 비우면 다음 객체가 다른 메모리 공간 블록, 즉 객체가 저장된 블록에 할당되고 두 메모리 공간이 교대로 사용됩니다. JVM 힙 메모리의 새로운 세대는 Eden 공간, Survivor 공간, Survivor 공간으로 구분됩니다. 기본 Eden과 생존자 공간 비율은 8:1이며, 그 중 Eden이 80%를 차지하고, 각각 10%를 차지하며, 모든 차세대 메모리가 활용할 수 있는 공간은 90%입니다. 새로운 세대에서는 각 가비지 수집 중에 많은 수의 개체가 수집되므로 살아남은 개체 중 몇 개만 복사하면 됩니다. 복사 알고리즘의 동작 과정은 다음과 같습니다.
마크 정리 알고리즘:
복사 알고리즘은 많은 수를 복사해야 하기 때문에 객체 생존율이 높은 경우 사용하기 쉽지 않습니다. 살아남은 개체들. 더 중요한 것은 복사 알고리즘이 일부 공간을 낭비한다는 것입니다. Old Generation은 상대적으로 수명이 긴 객체를 저장하기 때문에 복제 알고리즘을 사용하는 것은 적합하지 않습니다. 구시대의 특성에 맞춰 마크정렬 알고리즘을 제작하였다. mark-compact 알고리즘은 먼저 살아남은 객체를 표시한 다음 이를 한쪽 끝으로 이동한 다음 끝 경계 외부의 객체 메모리를 해제합니다. mark-collation 알고리즘의 실행 과정은 다음과 같습니다.
2. 메모리 할당 및 재활용 전략
Java 기술 시스템에서 주장하는 자동 메모리 관리는 궁극적으로 메모리 자동 할당에 기인한다고 볼 수 있습니다. 객체에 할당된 메모리 객체를 재활용합니다. 메모리 복구에 관해서는 위의 가비지 수집 알고리즘을 참고할 수 있습니다. JVM은 객체 메모리를 복구하기 위해 세대별 가비지 수집 알고리즘을 사용하는데, 이는 신세대와 구세대로 구분되며, 신세대는 복사 알고리즘을 사용합니다. 생성에서는 마크 정렬 알고리즘을 사용합니다. JVM의 메모리 할당 전략을 살펴보겠습니다.
객체는 Eden 영역에 먼저 할당됩니다.
대부분의 경우 객체는 차세대 Eden 영역에 할당됩니다. Eden 영역에 할당할 메모리 공간이 충분하지 않으면 가상 머신은 Minor GC(New Generation GC)를 시작하여 New Generation에서 죽은 개체를 재활용합니다. 충분한 공간이 있으면 스토리지는 공간 할당 보장을 통해 이전 세대에 직접 입금됩니다. 그런 다음 개체를 Eden 영역에 저장합니다.
대형 객체는 Old Generation에 직접 들어갑니다.
대형 객체는 많은 양의 연속 메모리 공간이 필요한 객체를 의미합니다. 가장 일반적인 대형 객체는 매우 긴 문자열과 매우 긴 배열입니다. 대형 개체는 가상 머신의 메모리 할당에 있어서 나쁜 소식입니다. 대형 개체가 자주 발생하면 쉽게 가비지 수집이 사전에 실행되고 메모리에 여전히 많은 공간이 있을 때 대형 개체를 저장할 연속 공간이 생성될 수 있습니다. 작은 개체의 더 나쁜 상황은 프로그램을 작성할 때 피해야 하는 "단기 수명"의 큰 개체 그룹을 만나는 것입니다.
장기 생존 객체가 Old Generation으로 진입
가상 머신은 메모리 관리를 위해 세대별 수집 개념을 채택하기 때문에 가상 머신은 어떤 객체가 메모리를 관리해야 하는지 알아야 합니다. new Generation에 배치해야 하며, 어떤 개체를 Old Generation에 배치해야 하는지를 지정합니다. 가상 머신은 각 개체에 연령 카운터를 제공합니다. 이 객체가 Eden 영역에서 Minor GC를 경험하고 Survivor 영역에 저장되어 있다면 이 객체의 age는 1입니다. Minor GC에서 살아남을 때마다 객체의 age는 1씩 늘어납니다. 특정 레벨(기본값은 15세)인 경우 이전 세대로 승격됩니다.
동적 객체 연령 결정
다양한 프로그램의 메모리 조건에 더 잘 적응하기 위해 가상 머신은 항상 해당 연령이 될 때까지 기다릴 필요가 없습니다. 그 객체는 특정 수준에 도달해야만 Old Generation에 진입하게 됩니다. 나이는 구세대로 들어갈 것이다.
공간 할당 보장
구세대는 새로운 세대의 메모리 할당을 보장합니다. 즉, Minor GC를 수행하기 전에 가상 머신이 먼저 확인합니다. 이전 세대의 최대 연속 사용 가능한 메모리 공간은 새 세대의 모든 객체의 전체 공간보다 크거나 같습니까? 이보다 크거나 같다면 이번에는 Minor GC가 안전하다는 의미입니다. Minor GC, 새로운 세대의 객체가 이전 세대에 저장될 수 있습니다(Minor GC 이후 생존자 공간 메모리가 충분하지 않은 경우). 이 조건이 true가 아닌 경우 가상 머신은 HandlePromotionFailure 설정이 보증 실패를 허용하는지 확인합니다. 허용되는 경우 가상 머신은 이전 세대에서 사용 가능한 최대 연속 공간이 이전 세대로 승격된 개체의 평균 크기보다 큰지 여부를 확인합니다. Minor GC를 수행하려고 합니다. 보증 실패가 허용되지 않는 경우 Old Generation에서 더 많은 공간을 확보할 수 있도록 Full GC(Old Generation GC)를 수행하여 Old Generation에서 죽은 객체의 공간을 회수합니다.
위 내용은 Java에서 JVM 메모리를 할당하고 관리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!