>Java >java지도 시간 >Java 가상 머신의 메모리 할당 및 재활용 전략 분석 예

Java 가상 머신의 메모리 할당 및 재활용 전략 분석 예

PHPz
PHPz앞으로
2023-05-02 10:22:121374검색

메모리 할당 및 재활용 전략

Java 기술 시스템에서 자동 메모리 관리의 가장 근본적인 목표는 객체에 메모리를 자동으로 할당하는 것과 객체에 할당된 메모리를 자동으로 재활용하는 두 가지 문제를 자동으로 해결하는 것입니다.

1. 개요

객체의 메모리 할당은 개념적으로 힙에 할당되어야 합니다(실제로 JIT 컴파일 후 스칼라 유형으로 분해되어 스택에 간접적으로 할당될 수도 있습니다). 고전적인 세대 설계에서는 일반적으로 새로운 개체가 젊은 세대에 할당됩니다. 드문 경우(예: 개체 크기가 특정 임계값을 초과하는 경우)에는 Old 세대에 직접 할당될 수도 있습니다. 객체 할당 규칙은 고정되어 있지 않습니다. "Java Virtual Machine 사양"은 새로운 객체의 생성 및 저장 세부 사항을 규정하지 않습니다. 이는 가상 머신이 현재 사용 중인 가비지 수집기와 가상 머신의 메모리 관련 기능에 따라 다릅니다. . 매개변수 설정.

(1), 객체는 Eden에 먼저 할당됩니다

대부분의 경우 신세대 Eden 영역에 객체가 할당됩니다. Eden 영역에 할당할 공간이 충분하지 않으면 가상 머신은 Minor GC를 시작합니다.

1. 에덴 영역에 공간이 충분한 경우

가상 머신 매개변수

-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8

매개변수 설명

2MB 크기의 객체 3개와 4MB 크기의 객체 1개를 할당하고 런타임에 -Xms20M, -Xmx20M, -Xmn10M을 전달해 보세요. 이 매개변수는 Java 힙 크기를 20MB로 제한하며 확장할 수 없습니다. 10MB는 새 세대에 할당되고 나머지 10MB는 이전 세대에 할당됩니다. -XX: Survivor-Ratio=8은 새로운 세대의 Eden 영역과 Survivor 영역 간의 공간 비율이 8:1임을 결정합니다.

package com.xiao.test.Test;

public class test {
    private static final int _1MB = 1024 * 1024;
    public static void main(String[] args) {
        byte[] byte1,byte2,byte3;
        byte1 = new byte[2 * _1MB];
        byte2 = new byte[2 * _1MB];
        byte3 = new byte[2 * _1MB];   
    }
}

Java 가상 머신의 메모리 할당 및 재활용 전략 분석 예

2. 에덴 영역에 공간이 부족한 상황

가상머신 매개변수는 동일합니다

package com.xiao.test.Test;

public class test {
    private static final int _1MB = 1024 * 1024;
    public static void main(String[] args) {
        byte[] byte1,byte2,byte3,byte4;
        byte1 = new byte[2 * _1MB];
        byte2 = new byte[2 * _1MB];
        byte3 = new byte[2 * _1MB];
        byte4 = new byte[3 * _1MB];
    }
}

Java 가상 머신의 메모리 할당 및 재활용 전략 분석 예

분명히 Minor GC

(2), 큰 개체는 이전에 직접 들어갑니다. age

1. 빅오브젝트란?

대형 개체는 많은 양의 연속 메모리 공간이 필요한 Java 개체를 의미합니다. 가장 일반적인 대형 개체는 많은 수의 요소가 포함된 매우 긴 문자열 또는 배열입니다.

2. Java 가상 머신에서 대형 객체를 피해야 하는 이유

공간을 할당할 때 충분한 연속 공간을 확보하기 위해 메모리에 분명히 많은 공간이 있는 경우 가비지 수집이 미리 트리거될 수 있습니다. 적절하게 배치할 수 있는 공간입니다. 객체를 복사할 때 객체가 크다는 것은 메모리 복사 오버헤드가 높다는 것을 의미합니다.

3. Old Generation에 직접 들어가는 대형 객체의 장점

Eden 영역과 두 Survivor 영역 사이를 오가며 복사하는 것을 피하여 많은 양의 메모리 복사 작업이 발생함(HotSpot 가상 머신은 -XX: PretenureSizeThreshold 매개 변수 제공) , 이 설정보다 큰 값을 지정하세요. 값 개체는 이전 세대에서 직접 할당됩니다.

(3). 장기 생존 개체는 노년기로 진입합니다

1. 가상 머신은 개체가 장기 생존하는지 여부를 어떻게 판단합니까?

메모리를 재활용할 때 어떤 살아남은 개체를 새 세대에 배치해야 할지, 어떤 살아남은 개체를 이전 세대에 배치해야 할지 결정할 수 있어야 합니다. 이를 위해 가상 머신은 개체 헤더에 저장되는 각 개체에 대한 개체 수명(Age) 카운터를 정의합니다.

2. 개체 연령 증가 및 구세대 승격 과정

개체는 일반적으로 첫 번째 Minor GC 후에도 여전히 생존하고 생존자가 수용할 수 있는 경우 Eden 영역에서 생성됩니다. Survivor 공간을 선택하고 개체 연령을 1년으로 설정합니다. 개체가 생존자 영역에서 Minor GC에서 살아남을 때마다 해당 개체의 연령이 특정 수준(기본값은 15)에 도달하면 Old Generation으로 승격됩니다. 이전 세대로 승격될 개체의 연령 임계값은 -XX: MaxTenuringThreshold 매개 변수를 통해 설정할 수 있습니다.

3. 수명이 긴 개체가 구세대로 들어가는 이유

신세대의 가비지 수집 알고리즘이 마크 복사 알고리즘이라는 것은 우리 모두 알고 있습니다. 복사 오버헤드가 증가하는 문제가 발생합니다. 따라서 특정 연령 임계값보다 큰 개체를 Old 세대에 배치하여 가비지 수집 중에 새 세대에 대한 부담을 줄일 수 있습니다.

(4) 동적 개체 수명 결정

다양한 프로그램의 메모리 조건에 더 잘 적응하기 위해 HotSpot 가상 머신은 개체의 수명이 -XX:MaxTenuringThreshold에 도달해야 승격될 수 있도록 항상 요구하지는 않습니다. Old Generation에 있는 경우 같은 Age의 모든 객체의 크기의 합은 Survivor 공간의 절반보다 크며, 이 Age보다 크거나 같은 객체는 Old Generation에 직접 들어갈 수 있습니다. -XX:MaxTenuringThreshold에 필요한 연령을 기다리고 있습니다.

(5), 공간 할당 보장

1. 공간 할당 보장 내용

Minor GC가 발생하기 전에 가상머신은 이전 세대에서 사용 가능한 최대 연속 공간이 새 세대의 모든 객체의 총 공간보다 큰지 먼저 확인해야 합니다. 이 조건이 true이면 이번에는 Minor GC가 가능합니다. 안전을 보장합니다. 설정되지 않은 경우 가상 머신은 먼저 -XX: HandlePromotionFailure 매개변수의 설정 값이 보장 실패를 허용하는지 여부를 확인합니다. 허용되는 경우 이전 세대에서 사용 가능한 최대 연속 공간이 다음보다 큰지 계속 확인합니다. 이전 세대로 승격된 개체의 평균 크기입니다. 이보다 크면 Minor GC가 시도되지만, 이번에는 Minor GC가 더 작거나 -XX: HandlePromotionFailure 설정이 위험을 허용하지 않습니다. 대신 Full GC가 수행됩니다.

2. "모험"의 위험은 무엇입니까

앞서 언급했듯이 신세대에서는 복사 수집 알고리즘을 사용하지만 메모리 활용을 위해 Survivor 공간 중 하나만 회전 백업으로 사용하므로 많은 수의 경우 GC 이후에도 여전히 살아남는 상황 - 가장 극단적인 경우는 메모리 재활용 후에도 신세대의 모든 객체가 살아남는 것이며, Old 세대는 할당 및 보장이 필요하고, 수용할 수 없는 객체는 생존자를 기성세대에게 직접 보내는 것은 인생의 대출보증과 비슷하다. Old Generation에서 이러한 보장을 하기 위해서는 Old Generation 자체에 이러한 개체를 수용할 수 있는 공간이 아직 남아 있다는 것이 전제입니다. 그러나 이 재활용에서 얼마나 많은 개체가 살아남을지는 메모리 재활용이 실제로 완료되기 전에는 명확하게 알 수 없으므로 우리는 이전 재활용 시마다 Old Generation으로 승격된 객체 용량의 평균 크기를 경험치로 사용하여 Old Generation의 남은 공간과 비교하여 더 많은 공간을 확보하기 위해 Full GC를 수행할지 여부를 결정합니다. 구세대.

3. 보증서를 열어야 하나요?

과거 평균과 비교하는 것은 실제로 여전히 확률에 기반한 솔루션입니다. 즉, Minor GC 이후 생존하는 개체 수가 갑자기 증가하여 과거 평균보다 훨씬 높아지면 여전히 오류가 발생합니다. 실패 보장. 보장 실패가 발생하면 정직하게 Full GC를 다시 시작해야 하기 때문에 Pause 시간이 매우 길어집니다. 보증이 실패할 경우 원이 가장 크지만 Full GC가 너무 자주 발생하는 것을 방지하기 위해 일반적으로 -XX: HandlePromotionFailure 스위치를 켜두는 것이 좋습니다.

위 내용은 Java 가상 머신의 메모리 할당 및 재활용 전략 분석 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제