JVM 쓰레기 수집 기와 메모리 할당 사 이 드 정책
대답 의 답 은:
각종 메모리 유출, 메모리 유출 문 제 를 조사 해 야 할 때 쓰레기 수집 이 시스템 이 더 높 은 병발 량 의 병목 이 될 때 우 리 는 이러한 자동화 에 대해 조절 해 야 한다.
대상 이 이미 죽 었 다 고 어떻게 판단 합 니까?
더미 안에 자바 대상 의 인 스 턴 스 가 놓 여 있 기 때문에 쓰레기 수집 기 가 더 미 를 회수 하기 전에 먼저 이 대상 들 이 어떤 것 이 살 아 있 고 어떤 것 이 이미 죽 었 는 지 확인 해 야 한다.
1. 인용 계수 알고리즘
알고리즘 의 원리: 대상 에 게 인용 계수 기 를 추가 합 니 다. 한 곳 에서 그것 을 인용 할 때마다 계수 기 는 상응 하 게 1 을 증가 합 니 다. 인용 이 실 효 될 때 계수 기 는 1 을 줄 이 고 대상 의 카운터 가 0 일 때 대상 은 인용 되 지 않 습 니 다. 그러나 이 알고리즘 이 해결 하지 못 하 는 문 제 는 대상 자체 의 인용 입 니 다.외부 에서 서로 인용 하지 않 았 음 에 도 불구 하고 이들 의 인용 계수 기 는 1 이 아니 기 때문에 쓰레기 수집 기 는 이런 대상 을 회수 할 수 없다.
package com.GC;
public class ReferenceCountingGC {
public Object instance = null;
private static final int _1MB = 1024*1024;
private byte[] bigsize = new byte[2*_1MB];
public static void main(String[] args) {
ReferenceCountingGC a = new ReferenceCountingGC();
ReferenceCountingGC b = new ReferenceCountingGC();
a.instance = a;
b.instance = b;
a = null;
b = null;
System.gc();
}
}
마지막 GC 가 꼭 작 동 하 는 것 은 아니 지만분석 을 통 해 자바 가 사용 하 는 회수 전략 은 인용 계수 법 을 사용 하 는 것 이 아니 라 는 것 을 알 수 있다.
2. 루트 검색 알고리즘
주류 프로 그래 밍 언어 에 서 는 루트 검색 알고리즘 을 사용 하여 대상 의 생존 여 부 를 판단 한다.
기본 적 인 사고방식: 일련의 'GC Roots' 라 는 대상 을 기점 으로 이 노드 에서 아래로 검색 하기 시작 하고 검색 한 경 로 를 인용 체인 (Reference Chain) 이 라 고 한다. 한 대상 이' GC Roots' 에 도착 할 수 없 을 때 이 대상 이 사용 할 수 없다 는 것 을 설명 하면 회수 할 수 있 는 대상 으로 여 겨 진다.
자바 에 서 는 'GC Roots' 대상 으로 몇 가 지 를 포함 할 수 있 습 니 다.
1. 가상 컴퓨터 스 택 에서 인 용 된 대상
2. 방법 영역 클래스 정적 속성 참조 대상
3. 방법 구역 의 상수 참조 대상
4. 로 컬 방법 스 택 의 JNI 참조 대상
3. 인용 에 대하 여
JDK 1, 2 이후로인용 개념 을 개선 하고 확대 하 며 응용 을 네 가지 로 나 누 었 다. 강 한 인용, 부 드 러 운 인용, 약 한 인용, 허 인용 이다.
강 인용: 프로그램 코드 에 보편적으로 존재 합 니 다. new 에서 나 온 대상 과 유사 합 니 다. 그들 은 영원히 쓰레기 수집 기 에 의 해 회수 되 지 않 습 니 다.
소프트 인용: 유용 하지만 꼭 필요 하지 않 은 대상 을 묘사 하 는 데 사 용 됩 니 다. 이러한 대상 은 시스템 에 메모리 이상 이 발생 하기 전에 이 대상 들 을 케이스 회수 범위 에 넣 고 두 번 째 회 수 를 합 니 다. 메모리 가 충분 하지 않 을 때 만 이상 을 던 집 니 다.
약 인용: 필요 하지 않 은 대상 을 묘사 하고 강 도 는 부 드 러 운 인용 보다 약 하 며 다음 쓰레기 수집 이 발생 하기 전에 만 살아 남 을 수 있 습 니 다.
가상 인용: 우 리 는 가상 인용 을 통 해 대상 의 인 스 턴 스 를 얻 을 수 없습니다. 대상 에 게 가상 인용 과 관련 된 목적 은 이 대상 이 쓰레기 수집 기 에 의 해 수집 되 었 을 때 시스템 의 통 지 를 받 기 를 바 라 는 것 입 니 다.
회수 방법 영역
영구 세대 의 쓰레기 수 거 는 두 부분의 내용 이 있 는데 그것 이 바로 폐기 상수 와 쓸모없는 종류 이다
회수 상수 와 자바 더미 의 회수 차이 가 많 지 않다.
어떻게 쓸모없는 종 류 를 판단 합 니까?
1. 이러한 종류의 모든 인 스 턴 스 가 회수 되 었 습 니 다.
2. 이러한 종류의 로 더 를 불 러 오 는 것 은 회수 되 었 습 니 다.
3. 이 클래스 의 클 라 스 대상 은 어느 곳 에서 도 인용 되 지 않 았 으 며, 어느 곳 에서 도 반 사 를 통 해 이 클래스 를 방문 할 수 없습니다.
쓰레기 회수 알고리즘
표기 - 명료 알고리즘
가장 기초적인 수집 알고리즘 으로서 그의 실현 원 리 는 그의 이름과 마찬가지 로 표기 와 명확 한 단계 로 나 뉜 다
단점: 효율 적 인 문제, 표시 와 명확 한 과정의 효율 이 높 지 않 습 니 다. 제거 한 후에 대량의 불 연속 메모리 파편 이 발생 합 니 다. 공간의 파편 이 너무 많아 서 큰 대상 을 분배 해 야 할 때 다른 쓰레기 수 거 를 미리 촉발 해 야 합 니 다.
복제 알고리즘
그것 의 출현 은 효율 적 인 문 제 를 해결 하기 위해 서 이다.
원리: 사용 가능 한 메모 리 를 두 개 로 나 누 어 매번 한 개 만 사용 합 니 다. 이 메모리 가 다 떨 어 지면 살 아 있 는 대상 을 다른 곳 으로 복사 한 다음 에 메모 리 를 한 번 에 지 웁 니 다. 그러나 메모리 조각 문 제 를 계속 고려 하지 않 아 도 됩 니 다. 꼭대기 의 지침 만 이동 하면 됩 니 다.
단점: 그 대 가 는 메모리 의 절반 이다.
또한 이 를 세 부분 으로 나 눌 수 있 습 니 다. 두 개의 survivor 가 비교적 작고 큰 eden 으로 나 눌 수 있 습 니 다. 회수 할 때 eden 과 survivor 를 다른 survivor 에 한꺼번에 복사 할 수 있 습 니 다.
태그 - 정리 알고리즘
복제 알고리즘 은 대상 의 재고 율 이 높 을 때 대량의 대상 을 복제 해 야 효율 이 낮 고 더 중요 한 것 은 50% 의 내용 을 낭비 할 수 있다 는 것 이다.
이 이름과 마찬가지 로 마지막 에 대상 을 직접 청소 하 는 것 이 아니 라 살아 있 는 대상 을 한 단락 으로 옮 겨 경계 이외 의 메모 리 를 청소 합 니 다.
세대 별 수집 알고리즘
이 알고리즘 은 대상 의 생존 주 기 를 몇 조각 으로 나 누 는 것 이다. 즉, 자바 의 더 미 는 신세대 와 옛날 로 나 뉘 어 서로 다른 세대 의 특성 을 가지 고 적당 한 쓰레기 수집 알고리즘 을 분배 하 는 것 이다.
신세대 에 서 는 쓰레기 수집 때마다 대상 이 많이 죽 기 때문에 복제 알고리즘 을 사용 하기에 적합 하 다.옛날 에는 대상 의 생존 율 이 높 았 기 때문에 '태그 - 정리' 또는 '태그 - 정리' 알고리즘 을 사용 하여 회수 할 수 있 었 다.
의 학습 노트
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바 문자열 풀우리는 Java에서 문자열이 힙 메모리 영역에 저장된다는 것을 알고 있습니다. 이 힙 메모리 내부에는 String Pool이라는 특정 메모리 영역이 있습니다. 문자열 프리미티브를 생성하면 자바 문자열의 불변성 덕분에...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.