디렉터리 비비-JVM-0-개편 비비-JVM-1-자바 메모리 영역 비비-JVM-2-대상 비비-JVM-3-쓰레기 수집 알고리즘 비비-JVM-4-HotSpot JVM 비비-JVM-5-쓰레기 수거기비-JVM-6-회수 전략 비비-JVM-7-자바 클래스 파일 구조 비비-JVM-8-클래스 로딩 메커니즘 비-JVM-9-클래스 로더 비비-JVM-10-가상 컴퓨터 비비비-Bi-JVM 최적화 컴파일기 비비-비비-비비-12-JVM 최적화Bi - JVM-13-동시
프로그램 계수기, 가상 머신 창고, 로컬 방법 창고 등 세 부분의 구역은 라인에 따라 생겨나 사라진다. 각 창고의 메모리가 얼마나 분배되는지는 기본적으로 컴파일하는 기간에 알 수 있다. 그들의 분배와 회수는 확정성이 있기 때문에 회수 문제를 고려할 필요가 없다.한편, 자바 더미는 방법 구역과 다르다. 한 방법의 여러 지점에 필요한 메모리가 다르기 때문에 프로그램이 실행되는 동안 어떤 대상을 만들어야 하는지 알 수 있다. 이 부분의 메모리의 분배와 회수는 동적이다.
GC가 수행해야 할 3가지 사항: 1) 어떤 메모리를 회수해야 합니까?2) 회수는 언제 하나요?3) 재활용 방법
1. 대상의'생존'을 판단하는 방법
인용 계수 알고리즘[좋지 않음]
대상에 인용 계수기를 추가하고 한 곳에서 인용할 때마다 계수기 값이 1을 추가합니다.인용이 효력을 상실할 때 계수기 값은 1을 감소한다.언제든지 카운터가 0인 대상은 인용되지 않고 죽는 대상이다.문제: 대상 간의 상호 순환 인용 예를 해결하기 어렵다. 대상 a, b는 더 이상 방문할 수 없지만 그들은 서로 이 대상을 인용하기 때문에 그들의 인용 계수가 0이 되지 않는다.그래서 주류의 자바 가상기는 이런 방법으로 메모리 관리를 하지 않았다.
public static void main(String[] args) {
A a = new A();
B b = new B();
a.obj = b;
b.obj = a;
a = null;
b = null;
System.gc();
}
가달성 분석 알고리즘[주류 프로그램 언어가 사용하는 방법]
일련의 [GC Roots] 대상을 시작점으로 하여 이 노드에서 아래로 검색하고 지나가는 경로를 [인용체인]이라고 하는데 한 대상이 GC Roots에 아무런 인용체인도 연결되지 않을 때 이 대상을 사용할 수 없다.
Java에서 GC Roots로 사용할 수 있는 대상은 다음과 같다. 1) 가상 기기 창고에서 인용할 수 있는 대상 2) 로컬 방법 창고에서 JNI가 인용할 대상 3) 방법구에서 클래스 정적 속성을 인용할 대상 4) 방법구에서 상수로 인용할 대상
2.finalize() 방법
한 대상의 진정한 사망을 알리려면 적어도 두 번의 표기 과정을 거쳐야 한다. 첫 번째: 대상이 가달성 분석을 한 후에 GC Root과 연결된 인용체인이 없는 것을 발견하고 첫 번째 표기를 하고 한 번의 선별을 해야 한다. 선별 조건은 대상이finalize() 방법을 실행할 필요가 있는지이다.대상이finalize () 방법을 덮어쓰지 않았거나finalize () 방법이 가상 기기에서 호출되었을 때 가상 기기는 이 두 가지 상황을 [실행할 필요가 없음] 으로 간주합니다.두 번째: 대상은finalize () 방법을 실행할 필요가 있습니다. 이 대상을 F-Queue 대기열에 놓고 낮은 우선순위의Finalizer 라인으로 실행할 수 있습니다.finalize () 방법은 대상이 죽음의 운명에서 탈출할 수 있는 마지막 기회이며, GC는 F-Queue 대기열에 있는 대상을 2차 소규모 표기한다. 주의: 모든 대상의finalize () 방법은 시스템에서 자동으로 한 번만 호출되기 때문에finalize () 방법에서 탈출한 대상은 한 번만 탈출할 수 있습니다.F-Queue 대기열의 실행은 개별 객체의 호출 순서를 보장할 수 없습니다.그러므로finalize()에서 어떤 일도 하지 않는 것이 좋다.
3. 재활용 방법 영역
영구대 쓰레기 회수는 주로 두 부분으로 나뉘는데 그것이 바로 [폐기된 상량]과 [쓸모없는 종류]이다.폐기된 상수를 회수하는 것은 자바 더미의 대상을 회수하는 것과 유사합니다.
무용 클래스의 판단 조건: 1) 자바 더미에 이 클래스가 존재하지 않는 실례 2) 이 클래스를 불러온 ClassLoader가 회수되었습니다 3) 이 클래스에 대응하는 자바.lang.Class 대상은 어느 곳에서도 인용되지 않으며, 이 클래스에 반사적으로 접근할 수 없습니다
반사, 동적 에이전트, CGLib 등 ByteCode 프레임워크, 동적 생성 JSP와 OSGi와 같은 빈번한 사용자 정의 ClassLoader 장면은 가상 기기가 [클래스 마운트 해제 기능]을 갖추어 영구적인 넘침을 피해야 한다.
4. 쓰레기 수집 알고리즘
1) 태그 - 지우기 알고리즘
두 단계로 나뉘어 먼저 회수할 대상을 표시하고 표시가 완료된 후에 모든 표지의 대상을 통일적으로 회수한다.결함: 표기와 제거 두 과정의 효율이 높지 않다.태그를 지우면 대량의 불연속 메모리 파편이 발생하는데 프로그램이 실행되는 과정에서 큰 대상을 분배해야 할 때 연속적인 메모리 공간을 찾을 수 없기 때문에 다른 쓰레기 회수 동작을 미리 터치해야 한다.
2) 복제 알고리즘 [JVM 신세대가 사용하는 알고리즘]
메모리를 용량에 따라 크기가 같은 두 블록으로 나누어 한 번에 한 조각만 사용한다.이 메모리를 다 사용하면 살아있는 대상을 다른 블록 위에 복사한 다음 이미 사용한 이 메모리 공간을 한 번에 모두 정리합니다.장점: 간단하고 효율이 높으며 자물쇠가 없다.결함: 메모리 반, 낭비. [신세대]의 대상은 98%가'조생석사'[생존율이 높지 않음]이기 때문에 복제 알고리즘으로 회수하기에 적합하지만 반드시 1:1로 메모리 공간을 나누는 것은 아니다.Eden: Survivor1: Survivor2 = 8:1:1로 나뉘어 있으며, 매번 Eden과 그 중의 Survivor를 사용하면 회수할 때 Eden과 Survivor1에 살아있는 대상을 Survivor2에 한꺼번에 복사하고 마지막으로 Eden과 Survivor1 공간을 정리합니다.이렇게 해서 신세대는 [10%]의 메모리 공간만 낭비했다.신세대에서 회수하는 공간이 10%보다 크면 서바이버2 공간이 충분하지 않을 때 많은 대상은 직접 [분배 담보 메커니즘]을 통해 [구시대]로 진입한다.
3) 표기-정리[JVM 구시대에 사용된 알고리즘]
태그-지우기 알고리즘과 마찬가지로 회수 가능한 대상을 직접 청소하는 것이 아니라 살아있는 모든 대상을 한쪽으로 이동시킨 다음 경계 이외의 메모리를 직접 청소한다. 구시대에는 대상[생존율이 높음][추가 공간이 없어 담보할 수 없음]이 있었기 때문에 반드시 표기-정리/정리 알고리즘을 사용해야 하며 복제 알고리즘으로 담보할 수 없었다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다: