>  기사  >  Java  >  Java Garbage Collector의 방법과 원리 요약

Java Garbage Collector의 방법과 원리 요약

高洛峰
高洛峰원래의
2017-01-17 15:36:321184검색

Java 가비지 컬렉터란 무엇인가요?

Java 가비지 컬렉터는 JVM(Java Virtual Machine)의 세 가지 중요한 모듈 중 하나입니다. 나머지 두 모듈은 인터프리터와 멀티스레딩입니다. 메커니즘) 애플리케이션은 자동 메모리 할당(메모리 할당) 및 자동 재활용(가비지 수집) 기능을 제공합니다. 두 작업 모두 Java 힙(메모리 블록)에서 발생합니다. 특정 시점에서 객체에 자신을 가리키는 참조(Rreference)가 두 개 이상 있으면 객체는 살아 있고(Live), 그렇지 않으면 죽은(Dead) 것으로 간주되어 쓰레기로 간주되어 재활용 및 재사용이 가능합니다. 가비지 컬렉터. 가비지 수집 작업은 CPU, 스레드, 시간 등의 자원을 소모하므로 가비지 수집 작업이 실시간으로 발생하지 않는다는 점(메모리가 소모되거나 특정 지표에 도달하면 객체가 즉시 해제됨)을 이해하기 쉽습니다. (임계값, 사용된 메모리는 총 메모리 비율(예: 0.75)을 차지함) 가비지 수집 작업이 트리거됩니다. 객체 소멸에 대한 예외가 있습니다. java.lang.Thread 유형의 객체에 참조가 없더라도 스레드가 계속 실행되는 한 재활용되지 않습니다.

재활용 메커니즘

통계 분석에 따르면 Java의 대부분의 개체(일부 고급 언어 포함)는 수명 주기가 짧으므로 Java 메모리는 여러 세대에 걸쳐 관리됩니다. 세대별 세대의 목적은 성능을 극대화하기 위해 서로 다른 세대의 메모리 블록에 대해 서로 다른 관리 전략(알고리즘)을 사용하는 것 이상입니다. 구세대에 비해 젊은 세대는 일반적으로 크기가 훨씬 작고 재활용 빈도가 높고 속도가 빠릅니다. 구세대는 재활용 빈도가 낮고 시간이 오래 걸린다. 메모리는 Young Generation에 할당됩니다. 여러 재활용 주기 후에도 여전히 남아 있는 Young Generation의 개체는 자동으로 Old Generation으로 승격됩니다.

Java Garbage Collector의 방법과 원리 요약

디자인 선택

디자인 선택은 JVM 가비지 수집기 구현의 어려움과 JVM의 성능 지표에 영향을 미치며 다양한 시나리오에 적용됩니다. 재활용 알고리즘의 스타일 특성을 설명합니다.

단일 스레드 직렬 재활용 VS 멀티 스레드 병렬 재활용

재활용 작업 자체가 멀티 스레드인지의 문제. 단일 스레드 재활용의 장점은 간단하고 구현이 쉽고 조각화가 적고 단일 코어 시스템에 적합하다는 것입니다. 멀티 스레드 병렬 재활용은 멀티 코어 시스템의 CPU 리소스를 최대한 활용하고 재활용 시간을 단축하며 생산성을 높일 수 있습니다. 단점은 복잡하고 일부 조각이 재활용되지 않을 수 있다는 것입니다.

재활용 중 애플리케이션 스레드 일시 중지 VS 재활용과 애플리케이션이 동시에 수행됨

재활용 작업 중 애플리케이션 스레드를 일시 중지할지 여부의 문제. 애플리케이션 스레드를 일시 중지하는 경우의 장점은 단순성, 정확성, 상대적으로 깔끔한 정리 및 짧은 정리 시간입니다(CPU 리소스는 배타적임). 단점은 애플리케이션 스레드를 일시 중지하면 가비지 수집 주기 동안 애플리케이션 응답 시간이 길어진다는 것입니다. 실시간 성능이 매우 높습니다. 시스템은 상대적으로 민감합니다. 재활용 스레드와 응용 스레드의 병렬 처리의 장점은 응용 프로그램 응답 시간이 상대적으로 안정적이라는 점이지만, 구현하기 어렵고 정리 빈도가 높으며 조각이 발생할 수 있다는 단점이 있습니다.

해제된 메모리 세그먼트를 병합하지 않음 VS 릴리스된 메모리 세그먼트 병합 VS 활성 세그먼트를 새 위치에 복사

이 세 가지 옵션은 데드 메모리 블록 조각을 관리하는 방법을 설명합니다. 죽은 메모리 조각은 일반적으로 힙 전체에 흩어져 있습니다. 관리되지 않으면 사용 가능한 메모리 검색으로 인해 메모리 할당이 느려집니다. 작은 조각으로 인해 메모리가 낭비됩니다(예: 큰 배열 요구 사항). 연속 메모리 세그먼트). 관리하는 방법에는 두 가지가 있습니다. 라이브 메모리를 메모리 블록의 한쪽 끝으로 이동하고 사용 가능한 메모리의 시작 위치를 기록하거나 단순히 라이브 메모리를 새 메모리 영역에 복사하고 원래 메모리 블록을 비워 두는 것입니다.

성능 지표

Ⅰ, 생산성(처리량)

장기간(장기간이 의미 있음) 내에서 재활용되지 않는 비율 시간 대 총 시간. 시스템의 운영 효율성을 측정합니다.

②, Garbage Collection Overhead(Garbage Collection Overhead)

더 긴 기간 동안 총 시간 대비 재활용 시간의 비율입니다. 생산성에 해당하며 합산하면 100%가 됩니다.

3, 일시정지 시간

Java 가상 머신이 쓰레기를 재활용할 때 일부 알고리즘은 모든 애플리케이션 스레드의 실행을 일시 중지합니다. 일시정지 간격.

4, 수거빈도

재활용 작업이 이루어지기까지 평균 시간이 얼마나 소요됩니까?

⑤. 메모리 점유 크기(Footprint)

힙 크기 등.

⑥, 실시간(신속성)

객체가 죽은 이후 객체가 차지한 메모리가 재활용되기까지 얼마나 걸리나요?

가비지 컬렉션 유형

모든 컬렉터 유형은 세대별 기술을 기반으로 합니다. Java HotSpot 가상 머신에는 Young Generation, Old Generation 및 Permanent Generation의 3세대가 포함됩니다.

①영구 생성

은 클래스, 메소드 및 설명 정보를 저장합니다. 두 가지 선택적 옵션 -XX:PermSize=64m 및 -XX:MaxPermSize=128m을 통해 초기 크기와 최대값을 지정할 수 있습니다. 일반적으로 이 매개변수는 조정할 필요가 없습니다. 기본 영구 생성 크기이면 충분합니다. 그러나 로드된 클래스가 너무 많아 충분하지 않은 경우 최대값을 조정하면 됩니다.

②기성세대

주로 여러 재활용 주기에서 살아남고 업그레이드되는 젊은 세대의 개체를 저장합니다. 물론 일부 대용량 메모리 할당의 경우 영구 세대에 직접 할당할 수도 있습니다(극단적인 예는 젊은 세대를 저장할 수 없다는 것입니다). 조금도).

3젊은 세대

대부분의 메모리 할당 및 재활용 작업이 젊은 세대에서 발생합니다. 아래 그림과 같이 Young Generation은 원래 영역(Eden)과 두 개의 작은 생존 영역(Survivor)의 세 영역으로 구분되며, 두 개의 생존 영역은 기능에 따라 From과 To로 구분됩니다. 대부분의 객체는 원래 영역에 할당되며, 여러 번 가비지 수집 작업에서 살아남은 객체는 생존 영역에 배치됩니다.

Java Garbage Collector의 방법과 원리 요약

Serial Collector

클라이언트 모드에서는 단일 스레드가 재활용 작업을 수행하여 재활용 중에 모든 애플리케이션 스레드의 실행을 일시 중지합니다. 기본 수집기가 강제로 적용됩니다. -XX:+UseSerialGC 명령줄 ​​옵션을 통해 지정됩니다.

① Young Generation 재활용 알고리즘(Minor Collection)

Eden 영역에서 살아남은 객체를 To 영역으로 이동합니다. From 영역을 Old 세대로 이동합니다. 너무 오래된 것은 To 영역으로 이동합니다. To 영역이 맞지 않으면 바로 Old 세대로 이동됩니다. From 영역에서는 Old Generation으로 업그레이드됩니다. 재활용이 완료되면 Eden과 From 영역이 모두 비어 있습니다. 이때 From과 To의 기능이 바뀌며, From이 To가 되고, To가 From이 됩니다. 디자인 선택이 복사 중입니다.

②구세대 재활용 알고리즘(풀 컬렉션)

구세대 재활용은 마크(Mark), 스윕(Sweep), 컴팩트(Compact) 3단계로 나누어진다. 마킹 단계는 모든 살아있는 객체를 표시하고, 클리어 단계는 죽은 객체를 모두 해제하며, 병합 단계는 모든 살아있는 객체를 Old Generation의 앞 부분에 병합하고 모든 자유 세그먼트를 뒤에 남겨 둡니다. 메모리 조각화를 줄이기 위해 디자인 선택이 병합됩니다.

병렬 수집기

여러 스레드를 사용하여 동시에 가비지 수집을 수행할 수 있습니다. 멀티 코어 환경에서는 CPU 리소스를 최대한 활용하고 재활용 시간을 줄일 수 있으며, JVM 생산성을 높입니다. 서버 모드의 기본 수집기입니다. 직렬 수집기와 마찬가지로 수집 중에 모든 애플리케이션 스레드의 실행이 일시 중지됩니다. -XX:+UseParallelGC 명령줄 ​​옵션에 의해 강제됩니다.

① 젊은 세대 수집 알고리즘(Minor Collection)

가비지 수집을 위해 여러 스레드를 사용하며, 각 스레드의 알고리즘은 직렬 수집기와 동일합니다.

②구세대 재활용 알고리즘(전체 컬렉션)

구세대는 여전히 직렬 수집기와 마찬가지로 단일 스레드입니다.

병렬 압축 컬렉션

젊은 세대와 오래된 세대의 컬렉션을 멀티스레딩으로 처리합니다. 명령 옵션 -XX:+UseParallelOldGC로 지정되는 -XX:ParallelGCThreads=3은 병렬 재활용에 참여하는 스레드 수를 추가로 지정할 수 있습니다. 직렬 수집기와 마찬가지로 수집 중에 모든 애플리케이션 스레드의 실행이 일시 중지됩니다. 병렬 수집기에 비해 Old Generation의 수집 시간이 짧아서 일시 중지 시간 간격(Pause time)이 줄어듭니다. –XX:+UseParallelOldGC 명령줄 ​​옵션에 의해 강제됩니다.

①젊은 세대의 수집 알고리즘(Minor Collection)

병렬 수집기와 동일(Parallel Collector)

②구세대의 수집 알고리즘( Full Collection) )

기존 세대는 마킹, 통계, 병합의 3단계로 구분됩니다. 여기서는 Old Generation을 고정된 크기의 여러 영역으로 나누는 데 분할 아이디어가 사용됩니다. 마킹 단계에서는 살아남은 모든 개체를 N개의 그룹으로 나눕니다(재활용 스레드 수와 동일해야 함). 각 스레드는 독립적으로 자신의 그룹을 담당하며 살아남은 개체의 위치와 생존율 정보를 표시합니다. 병렬로 표시된 지역(Region). 통계 단계에서는 각 지역의 생존율을 계산하는데, 원칙적으로 앞쪽의 생존율이 더 높으며, 앞에서 뒤쪽으로 병합할 가치가 있는 시작 위치를 찾습니다(대부분의 개체가 살아있는 지역은 병합할 가치가 없습니다). 통계 단계는 직렬(단일 스레드)입니다. 병합 단계에서는 통계 단계의 정보를 기반으로 멀티 스레드가 살아남은 개체를 한 지역(Region)에서 다른 지역(Region)으로 병렬로 복사합니다.

Concurrent Mark-Sweep Collector

Low-latency Collector라고도 하며 다양한 수단을 사용하여 애플리케이션을 만듭니다. 프로그램이 최단 시간 동안 중단됩니다. 재활용 작업은 기본적으로 병합 및 복사 작업 없이 애플리케이션과 동시에 수행됩니다. -XX:+UseConcMarkSweepGC 명령줄을 통해 지정하면 단일 코어 또는 듀얼 코어 시스템에서 증분 재활용 모드 -XX:+UseConcMarkSweepGC를 지정할 수도 있습니다. 증분 재활용은 재활용 작업을 여러 조각으로 나누고, 하나의 조각을 실행한 후 애플리케이션에 CPU 리소스를 할당하고, 향후 특정 시점에 마지막 결과를 계속해서 재활용하는 것을 의미합니다. 지연을 줄이는 것도 목적입니다.

①젊은 세대의 수집 알고리즘(Minor Collection)

병렬 수집기와 동일(Parallel Collector)

②구세대의 수집 알고리즘( Full Collection) )

은 이니셜 마크, 동시 마크, 비고, 동시 스윕의 4단계로 구성됩니다. 특히 병합 작업이 없으므로 조각화가 발생한다는 점에 유의하세요.

초기화 단계: 애플리케이션 스레드를 일시 중지하고 살아남은 모든 개체를 찾습니다. 시간이 짧고 재활용기는 단일 스레드를 사용합니다.

동시 표시 단계: 수집기 표시 작업은 애플리케이션과 동시에 실행되며 수집기는 단일 스레드를 사용하여 활성 개체를 표시합니다.

다시 표시: 동시 표시 단계에서는 애플리케이션도 실행 중이므로 이 프로세스 중에 개체가 추가되거나 수정될 수 있습니다. 따라서 애플리케이션 스레드를 다시 일시 중지하고 수정된 모든 개체를 찾은 다음 다중 스레드 표시를 사용하십시오.

동시 정리: 수집기 정리 작업은 애플리케이션과 동시에 실행되며 수집기는 단일 스레드를 사용하여 죽은 개체를 정리합니다.

Java 가비지 수집기 성능 평가 도구

1–XX:+PrintGCDetails 및 –XX:+PrintGCTimeStamps

가비지 수집 시작 시간, 기간, 각 세대의 여유 메모리 및 기타 정보.

②jmap [options] pid

jamp 2043 2043 프로세스에서 로드된 공유 객체를 봅니다. 일반적으로 DLL 파일입니다.

jmap -heap 2043 메모리 힙의 구성 정보 및 사용량을 봅니다.

jmap -permstat 2043 영구 생성의 로딩 상태를 확인합니다.

jmap -histo 2043 클래스의 로딩 및 메모리 사용량을 확인합니다.

③jstat [옵션] pid

jstat -class 2043 클래스 로딩, 언로딩, 메모리 사용량.

jstat -gc 2043 GC 실행 상태입니다.

Postscript

Java는 자동 선택 및 자동 성능 최적화 기능을 제공합니다. 가비지 컬렉터를 튜닝하기 전에 먼저 우려되는 성능 지표를 나열하고 명령줄을 통해 JVM에 알려주십시오. 만족스럽지 않으면 가비지 컬렉터를 지정하면 됩니다. . OutOfMemory는 일반적으로 힙 메모리 부족으로 인해 발생합니다. -Xmx1024m 및 -XX:MaxPermSize=128m 명령줄 옵션을 조정하면 됩니다.

위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되기를 바랍니다.

Java 가비지 컬렉터의 방법과 원리에 대한 더 많은 관련 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.