이 글은 Java 가비지 컬렉션 메커니즘 학습 요약을 공유합니다
메모리 누수: 메모리 누수는 메모리 공간이 사용된 후 재활용되지 않는다는 의미입니다. 일반적으로 Java에서 메모리 누수는 메모리 개체의 수명 주기가 프로그램에 존재하는 시간을 초과하기 때문에 발생합니다.
가비지 수집의 의미: 프로그래밍 시 고려해야 할 메모리 관리 문제를 해결합니다. , 메모리 누수 문제를 효과적으로 해결하고, 여유 메모리 공간을 최대한 활용하세요. Java 객체에는 더 이상 범위 개념이 없으며 객체에 대한 참조에만 범위가 있습니다.
기본 작업 : (1) 쓸모없는 물건을 발견합니다. (2) 쓸모없는 물건이 차지한 공간을 재활용하여 다시 사용할 수 있는 공간으로 해제합니다. 프로그램.
재활용 시간 : 가비지 수집이 발생하는 구체적인 시간은 예측할 수 없습니다. 일반적으로 두 가지 기회가 있습니다.
프로그래머는 JVM의 GC 인터페이스를 호출하지만 가비지 수집을 수행하고 싶다는 것만 시스템에 알립니다.
프로그램이 실행될 때, 메모리 블록이 필요하지만 현재는 이를 충분히 제공할 수 없습니다. 블록이 크면 시스템은 가비지 수집을 위해 GC를 호출합니다.
재활용 알고리즘 :
참조 계산 방법
내용: 각 객체가 생성될 때 객체 인스턴스가 변수(참조 카운터라고 함)에 할당되면 변수 카운트의 초기 값은 1로 설정됩니다. 객체가 참조되면 카운트 값이 1 증가합니다. 객체 인스턴스의 참조가 수명을 초과하면 사이클 또는 is 다른 값으로 설정되면 참조 카운터가 1씩 감소합니다. 참조 카운터 값이 0에 도달하면 가비지 수집이 가능합니다. (참고: 이 객체 인스턴스는 다른 객체를 참조할 수도 있으므로 객체가 재활용되면 참조하는 모든 객체의 카운터가 1씩 감소합니다.)
평가: 실제보다 더 빠르게 실행될 수 있습니다. 시간 시스템에서는 더 편리하지만 순환 참조 문제를 해결할 수는 없습니다. 예를 들어 객체 a와 객체 b는 서로를 참조하지만 a와 b의 값은 null로 할당됩니다. 이때 a와 b가 참조하는 객체는 더 이상 접근할 수 없지만 참조합니다. 이 시점에서 GC는 절대 해당 참조 카운터 값을 회수하지 않습니다.
루트 검색 알고리즘
내용: 프로그램의 모든 참조 관계를 그래프로 처리하고 루트 노드 GC 루트 객체에서 시작하여 참조에 해당하는 노드를 찾습니다. 등의 경우 모든 참조 노드는 그래프를 형성하고 나머지 노드는 참조되지 않은 노드, 즉 쓸모없는 노드로 간주됩니다.
Java에서 GC 루트 객체로 사용되는 객체는 Java 가상 머신 스택에서 참조되는 객체, 메소드 영역에서 정적 속성에서 참조하는 객체, 메소드 영역에서 상수에서 참조하는 객체, 로컬 메서드 스택
표시 지우기 알고리즘
콘텐츠: 루트 컬렉션에서 스캔하고, 살아남은 객체를 표시한 다음, 모든 스캔 후 재활용을 위해 표시되지 않은 객체를 스캔합니다.
평가: 개체를 이동할 필요가 없으며 생존하지 않는 개체만 처리하는 것이 더 효율적이지만 메모리 조각화가 발생합니다.
마크-조직 알고리즘
내용: 알고리즘 3에 따라 쓸모 없는 객체를 재활용한 후 살아남은 모든 객체를 여유 공간으로 이동하여 여유 메모리를 정리합니다.
평가: 간접비가 증가하지만 단편화 문제가 해결되었습니다.
참고: 알고리즘 3, 4, 5는 모두 루트 검색 알고리즘에 속하며 이해하기 쉽도록 여기에서는 별도로 설명합니다.
복사 알고리즘
내용: 메모리를 객체 영역과 자유 영역으로 나누어 객체 영역을 스캔한 후 객체 영역의 유효한 노드를 모두 복사합니다. 자유 영역으로 이동한 후 원래 개체 영역을 해제하면 원래 개체 영역이 자유 영역이 됩니다. 객체 영역과 자유 영역을 전환하는 동안 가비지 수집이 완료됩니다.
평가: 핸들 재활용이 줄어들고 조각화가 발생하지 않지만 전환 과정에서 프로그램을 일시 중지해야 합니다.
생성 알고리즘
은 Java 클래스, 메소드 등과 같은 정적 파일을 저장하는 데 사용됩니다. 영속 세대는 가비지 수집에 큰 영향을 미치지 않습니다
젊은 세대에서 N개의 가비지 수집 후에도 여전히 남아 있는 객체는 Old 세대에 배치됩니다. 따라서 Old Generation은 긴 수명주기를 가지고 객체를 저장한다고 볼 수 있다.
신세대에 비해 메모리가 훨씬 큽니다(아마도 비율은 1:2일 것입니다). Old 세대의 메모리가 가득 차면 Major GC, 즉 Full GC가 발생합니다. GC는 상대적으로 낮고, Old Generation의 객체 생존 시간은 상대적으로 높습니다.
새로 생성된 모든 객체는 먼저 Young Generation에 배치됩니다. 젊은 세대의 목표는 수명이 짧은 물건을 최대한 빨리 수집하는 것입니다.
신세대 메모리는 1개의 에덴 영역과 2개의 서바이버(survivor0,survivor1) 영역으로 8:1:1의 비율로 나누어집니다. 하나의 Eden 영역과 두 개의 Survivor 영역(일반적으로 말하자면). 대부분의 객체는 에덴 지역에서 생성됩니다. 재활용 시에는 먼저 eden 영역에 남아 있는 객체를 생존자0 영역으로 복사한 후, 이 생존자0 영역도 가득 차면 에덴 영역과 생존자0 영역에 남아 있는 객체를 다른 생존자1 영역으로 복사한 후 eden 영역을 클리어합니다. eden과 이 영역을 클리어하면, 이번에는survivor0영역이 비어 있다가,survivor0영역과survivor1영역이 교환됩니다.즉,survivor1영역은 비어있게 유지되는 식입니다.
survivor1 영역이 eden과 생존자0의 살아남은 객체를 저장할 만큼 충분하지 않을 경우, 살아남은 객체는 Old Generation에 직접 저장됩니다. Old Generation도 Full GC가 발생하게 되는데, 즉 New Generation과 Old Generation 모두 재활용됩니다.
New Generation에서 발생하는 GC를 Minor GC라고도 합니다. Minor GC의 빈도는 상대적으로 높습니다(Eden 영역에서만 발생하는 것은 아님)
내용: 다양한 개체의 다양한 수명 주기를 기반으로 개체가 여러 세대에 걸쳐 처리됩니다. (3세대로 나누어진다: 신세대, 구세대, 지속세대).
신세대:
기성세대:
지속세대:
위 내용은 Java 가비지 수집 메커니즘 학습 요약 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!