자바 쓰레기 수집가는 무엇입니까?
Java Garbage Collector는 JVM (Java Virtual Machine)의 세 가지 중요한 모듈 중 하나입니다 (다른 두 가지는 통역사 및 다중 스레드 메커니즘)입니다. 자동 메모리 할당 (메모리 할당) 및 자동 메모리 수집 (Garbage Collect) 기능이있는 응용 프로그램을 제공합니다. 두 작업은 Java 힙에서 발생합니다 (메모리 조각이 빠릅니다). 특정 시점에서 객체에 둘 이상의 참조가 가리키는 경우 객체가 실시됩니다. 그렇지 않으면 쓰레기로 간주되며 쓰레기 수집가가 재활용하고 재사용 할 수 있습니다. 가비지 수집 작업에는 CPU, 스레드, 시간 및 기타 리소스가 필요하므로 가비지 수집 작업이 실시간으로 발생하지 않는다는 것을 쉽게 이해할 수 있습니다 (사망 직후에 개체가 방출됩니다). 메모리가 소비되거나 특정 표시기에 도달하면 (임계 값이되면, 메모리 대 전체 메모리의 비율이 0.75와 같이 사용됩니다) 쓰레기 수집 작업이 트리거됩니다. 물체의 죽음에 대한 예외가 있습니다. Type java.lang.thread의 객체가 참조되지 않더라도 스레드가 여전히 실행되는 한 재활용되지 않습니다.
재활용 메커니즘
통계 분석에 따르면, Java의 대부분의 객체 (다른 고급 언어 포함)는 짧은 수명주기를 가지므로 Java 메모리는 여러 세대에 관리됩니다. 세대 부서의 목적은 성능을 극대화하기 위해 다른 세대의 메모리 블록에 다른 관리 전략 (알고리즘)을 사용하는 것 이상입니다. 구형 세대와 비교할 때 젊은 세대는 일반적으로 훨씬 작고 재활용 주파수는 높고 속도가 빠릅니다. 노인은 재활용 빈도가 낮고 오랜 시간이 걸립니다. 기억은 젊은 세대에 분포되어 있습니다. 젊은 세대의 물체는 여러 재활용주기 후에 구식으로 자동으로 홍보됩니다.
디자인 선택
설계 선택은 JVM Garbage Collector 및 JVM 성능 지표의 구현 어려움에 영향을 미치며 다양한 시나리오에 적합합니다. 재활용 알고리즘의 스타일 특성을 설명합니다.
단일 스레드 직렬 재활용 대 다중 스레드 병렬 재활용
재활용 작업 자체가 여러 스레드에 의해 처리되는지 여부에 대한 문제. 단일 스레드 재활용의 장점은 단순하고 구현하기 쉽고 조각이 거의 없으며 단일 코어 머신에 적합하다는 것입니다. 멀티 스레드 병렬 재활용은 멀티 코어 머신의 CPU 리소스를 완전히 활용하고 재활용 시간을 줄이며 생산성을 높일 수 있습니다. 단점은 복잡하고 일부 조각이 재활용되지 않을 수 있다는 것입니다.
재활용 동안 응용 프로그램 스레드를 일시 중지하는 대 재활용 및 응용 프로그램 동시
재활용 작업 중에 응용 프로그램 스레드를 일시 중지할지 여부를 발행하십시오. 응용 스레드를 일시 중지하는 장점은 간단하고 정확하며 비교적 깨끗하고 짧은 시간 동안 청소한다는 것입니다 (CPU 리소스 제외). 단점은 응용 프로그램 스레드를 일시 중지하는 것이 쓰레기 수집주기 동안 응용 프로그램 응답 시간을 연장하고 실시간 성능이 매우 높은 시스템이 더 민감하다는 것입니다. 재활용 및 응용 스레드의 병렬 처리의 장점은 적용 반응 시간이 비교적 안정적이며 단점은 달성하기 어렵고 청소 빈도가 높고 단편화가 가능하다는 것입니다.
Unmerge Freed Memory Fragments vs Merge Freed Memory Fragments vs Copy the Alive the Alive
이 세 가지 옵션은 죽은 메모리 블록 조각을 관리하는 방법을 설명합니다. 죽은 메모리 조각은 일반적으로 힙의 모든 곳에 흩어져 있습니다. 그들이 관리되지 않으면 두 가지 문제가 있습니다. 가용 메모리를 찾아서 메모리 할당이 느리면 작은 조각이 메모리 폐기물로 이어집니다 (예 : 큰 어레이가 큰 연속 메모리 조각이 필요합니다). 관리하는 두 가지 방법이 있습니다. 살아있는 메모리를 메모리 블록의 한쪽 끝으로 옮기거나 사용 가능한 메모리의 시작 위치를 녹음하거나 리빙 메모리를 새 메모리 영역에 간단히 복사하면 원래 메모리 블록이 완전히 비어 있습니다.
성능 지표
①. 생산성 (처리량)
회복 시간과 총 시간과 총 시간의 비율은 더 긴 기간 (장기간 만 의미가 있습니다). 시스템의 작동 효율성 측정.
②. 쓰레기 수집 오버 헤드
더 긴 기간 동안 회복 시간과 총 시간의 비율. 생산성에 해당하면 합계는 총 100%입니다.
③. 시간을 일시 중지합니다
Java Virtual Machines가 쓰레기를 재활용하면 일부 알고리즘은 모든 응용 프로그램 스레드의 실행을 일시 중지하고 일부 시스템은 일시 정지 시간 간격에 민감 할 수 있습니다.
④. 수집 빈도
회복하는 데 얼마나 걸립니까?
⑤. 메모리 사용 크기 (발자국)
힙의 크기처럼.
⑥. 실시간 (신속 함)
물체가 물체에서 메모리를 재활용하는 데 얼마나 걸립니까?
쓰레기 수집의 유형
모든 재활용기 유형은 세대 기술을 기반으로합니다. Java 핫스팟 가상 기계에는 3 세대, 젊은 세대, 구세대 및 영구 세대가 포함됩니다.
율의 한 세대
수업, 방법 및 설명 정보를 저장합니다. 초기 크기와 최대 값은 두 가지 옵션 옵션 -xx : permsize = 64m 및 -xx : maxpermsize = 128m로 지정할 수 있습니다. 일반적 으로이 매개 변수를 조정할 필요가 없으며 기본 영구 생성 크기로 충분하지만 클래스가 너무 많고 충분하지 않은 경우 최대 값을 조정하십시오.
② 노인 세대
여러 재활용주기가 여전히 살아남은 후에도 여전히 살아남고 업그레이드하는 젊은 세대의 주요 저장 대상은 여전히 살아 있습니다. 물론, 큰 기억 할당의 경우, 영구 세대에 직접 할당 될 수 있습니다 (극단적 인 예는 젊은 세대가 전혀 구할 수 없다는 것입니다).
세대 세대
대부분의 메모리 할당 및 재활용 작업은 젊은 세대에서 발생합니다. 아래 그림에서 볼 수 있듯이 젊은 세대는 원래 지역 (에덴)과 두 개의 작은 생존 지역 (생존자)의 세 가지 영역으로 나뉩니다. 두 개의 생존 영역은 그들의 기능에 따라 나누어진다. 대부분의 물체는 원래 지역에 할당되며, 가비지 수집 작업은 여전히 거실에 배치됩니다.
일련의 수집가
단일 스레드는 재활용 작업을 수행하고 재활용 기간 동안 모든 응용 프로그램 스레드의 실행을 중단합니다. 클라이언트 모드의 기본 재활용기는 -xx :+useerialgc 명령 줄 옵션을 통해 지정해야합니다.
① 젊은 세대를위한 미성년자 컬렉션
에덴 지역의 살아남은 물체를 지역으로 이동하십시오. TO 영역을 설치할 수없는 경우 구식으로 직접 이동하십시오. 지역을 설치할 수없는 경우 구식으로 직접 이동하십시오. 지역이 아주 오래된 경우 구식으로 업그레이드하십시오. 재활용이 완료되면 에덴과 지역 모두가 비어 있습니다. 이때, 교환 된 기능은 교환되며, 각각의 재활용 라운드 전에 비어 있습니다. 디자인 선택은 복제입니다.
② 노인의 재활용 알고리즘 (전체 컬렉션)
노인의 재활용은 Mark, Sweep 및 Merge의 세 단계로 나뉩니다. 마킹 스테이지는 모든 생존 한 물체를 표시하고, 청소 단계는 모든 죽은 물체를 방출하고, 병합 단계는 모든 살아남은 물체를 구식의 이전 부분으로 병합하여 모든 무료 조각을 남겨 둡니다. 디자인 선택은 메모리 조각화를 줄이기 위해 병합됩니다.
평행 수집기
여러 스레드를 사용하여 쓰레기 수집을 동시에 수행하십시오. 멀티 코어 환경은 CPU 리소스를 완전히 활용하고, 재활용 시간을 줄이고, JVM 생산성을 높이고, 기본 재활용기를 서버 모드의 기본 재활용기를 활용할 수 있습니다. 직렬 재활용기와 마찬가지로, 재활용 중에 모든 응용 프로그램 스레드의 실행이 중단됩니다. -xx :+useparallelgc 명령 줄 옵션을 통해 지정해야합니다.
① 젊은 세대를위한 미성년자 컬렉션
여러 스레드가 쓰레기를 재활용하는 데 사용되며 각 스레드의 알고리즘은 직렬 재활용기의 알고리즘과 동일합니다.
② 노인의 재활용 알고리즘 (전체 컬렉션)
구형 세대는 여전히 일련의 재활용기와 동일하게 단일 스레드입니다.
병렬 압축 컬렉션
젊은 세대와 구형 세대의 재활용은 멀티 스레딩으로 처리됩니다. 명령 옵션 -xx :+useparalleloldgc, xx : parallelgcthreads = 3에 의해 지정되면 병렬 재활용에 참여하는 스레드 수를 더 지정할 수 있습니다. 직렬 재활용기와 마찬가지로, 재활용 중에 모든 응용 프로그램 스레드의 실행이 중단됩니다. 평행 재활용기와 비교하여, 구형 세대는 재활용 시간이 짧아 일시 중지 시간이 줄어 듭니다. xx :+useparalleloldgc 명령 줄 옵션을 통해 지정해야합니다.
① 젊은 세대를위한 미성년자 컬렉션
평행 수집기와 동일합니다
② 노인의 재활용 알고리즘 (전체 컬렉션)
노인은 마킹, 계산 및 병합의 세 단계로 나뉩니다. 분할 아이디어는 여기에서 사용되며 구식은 고정 크기의 많은 영역으로 나뉩니다. 마킹 단계에서 모든 생존 객체는 N 그룹으로 나뉩니다 (재활용 스레드의 수는 재활용 스레드 수와 동일해야합니다). 각 스레드는 독립적으로 자체 그룹에 대한 책임이 있으며, 생존 대상의 위치와 지역 (지역)의 생존율 정보를 표시하고이를 평행하게 표시합니다. 통계 단계에서, 각 영역의 생존율이 계산된다. 원칙적으로, 정면의 생존율은 상대적으로 높다. 앞뒤로 병합 할 가치가있는 시작 위치가 발견됩니다 (대부분의 물체가 생존하는 영역은 병합 할 가치가 없습니다). 통계 단계는 직렬 (단일 스레드)입니다. 병합 단계에서 통계 단계의 정보에 기초하여, 다중 스레드는 생존 한 객체를 한 영역에서 다른 영역으로 병렬로 복사합니다.
동시 Mark-Sweep 수집기
저하 수집가라고도하는이 응용 프로그램은 다양한 수단을 통해 짧은 시간 동안 중단됩니다. 기본적으로 작업을 병합 및 복사하지 않고 응용 프로그램과 동시에 재활용 작업을 수행합니다. 명령 줄 -xx :+useconcmarksweepgc를 통해 지정된 경우, 단일 코어 또는 듀얼 코어 시스템에서 증분 재활용 모드 -xx :+useconcmarksweepgc의 사용을 지정할 수도 있습니다. 증분 재활용은 재활용 작업을 여러 조각으로 나누고 하나의 조각을 실행하고 응용 프로그램에 CPU 리소스를 방출 한 다음 미래의 특정 시점에서 마지막 결과를 계속 재활용하는 것을 말합니다. 목적은 지연을 줄이는 것입니다.
① 젊은 세대를위한 미성년자 컬렉션
평행 수집기와 동일합니다
② 노인의 재활용 알고리즘 (전체 컬렉션)
초기 마크, 동시 마크, 비고 및 동시 스윕의 네 단계로 나뉩니다. 특별한주의를 기울이면 병합 작업이 없으므로 조각이 있습니다.
Java 쓰레기 수집기의 성능 평가 도구
①xx :+printgcdetails 및 xx :+printgctimestamps
시작 시간, 지속 시간, 각 세대의 여분의 메모리 등에 대한 정보.
②jmap [옵션] PID
JAMP 2043 2043 프로세스에서로드 된 공유 객체를 봅니다. 일반적으로 DLL 파일.
JMAP -HEAP 2043 구성 정보 및 메모리 힙 사용을 확인하십시오.
JMAP -Permstat 2043 영구 생성의 로딩 상태를 확인하십시오.
JMAP -histo 2043 클래스의 로딩 및 메모리 사용량을 확인하십시오.
JSTAT [옵션] PID
JSTAT -CLASS 2043 클래스 로딩, 언로드, 메모리 사용.
JSTAT -GC 2043 GC 실행 상태.
추신
Java는 자동 선택 및 자동 성능 최적화 기능을 제공합니다. 쓰레기 수집기 튜닝을 수행하기 전에 먼저 관심있는 성능 표시기를 나열하고 JVM에 명령 줄을 통해 우려되는 성능 표시기를 알리고 JVM에 의해 자동으로 조정되었습니다. 만족하지 않으면 쓰레기 수집기를 지정할 수 있습니다. OutofMemory는 일반적으로 힙 메모리가 불충분하기 때문에 -xmx1024m 및 -xx : maxpermsize = 128m 명령 줄을 조정할 수 있습니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.