>  기사  >  Java  >  Java 메모리 관리: 할당 및 재활용 전략에 대한 자세한 설명

Java 메모리 관리: 할당 및 재활용 전략에 대한 자세한 설명

WBOY
WBOY앞으로
2023-04-22 15:04:171090검색

Java 메모리 관리: 할당 및 재활용 전략에 대한 자세한 설명

Java 메모리 관리: 할당 및 재활용 전략에 대한 자세한 설명

표 3-4 가비지 컬렉션 관련 공통 매개변수 plus -XX: + UseSerialGC

Java 메모리 관리: 할당 및 재활용 전략에 대한 자세한 설명

Java 메모리 관리: 할당 및 재활용 전략에 대한 자세한 설명

Java 메모리 관리: 할당 및 재활용 전략에 대한 자세한 설명

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

객체는 Eden에 먼저 할당됩니다

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

대형 개체는 직접적으로 구시대에 들어갑니다

대형 개체는 많은 양의 연속적인 메모리 공간이 필요한 Java 개체를 의미합니다. 가장 일반적인 대형 개체는 많은 수의 요소가 포함된 긴 문자열 또는 배열입니다. 예제의 [] 배열은 일반적인 대형 개체입니다. 대형 개체는 가상 머신의 메모리 할당에 있어 완전히 나쁜 소식입니다. 대형 개체를 만나는 것보다 더 나쁜 소식은 프로그램을 작성하는 "단기 대형 개체" 그룹을 만나는 것입니다. 이것.

Java Virtual Machine에서 큰 개체를 피해야 하는 이유는 공간을 할당할 때 충분한 연속 공간을 확보하기 위해 메모리에 아직 많은 공간이 있을 때 사전에 가비지 수집이 발생하기 쉽습니다.

객체를 복사할 때 객체가 크면 메모리 복사 오버헤드가 높아집니다. HotSpot 가상머신은 -XX:PretenureSizeThreshold 매개변수를 제공하는데, 이는 설정값보다 큰 객체를 Old Generation에 직접 할당하도록 지정하는 것으로, Eden 영역과 두 Survivor 영역 간 복사를 방지하기 위한 목적이다. 그 결과 많은 수의 메모리 복사 작업이 발생합니다.

-XX: PretenureSizeThreshold 매개변수는 두 개의 차세대 수집기인 Serial 및 ParNew에만 유효합니다. Parallel Scavenge와 같은 HotSpot의 다른 차세대 수집기는 이 매개변수를 지원하지 않습니다. 튜닝을 위해 이 매개변수를 사용해야 하는 경우 ParNew와 CMS의 컬렉터 조합을 고려하십시오.

오랜 기간 동안 살아남은 개체는 Old Age로 전환됩니다

가상 머신은 각 개체에 대한 개체 수명(Age) 카운터를 정의하며, 이는 Minor GC에서 살아남을 때마다 개체 헤더에 저장됩니다. 연령이 1년씩 증가합니다. 연령이 어느 정도 증가하면(기본값은 15) Old Generation으로 승격됩니다. 이전 세대로 승격될 개체의 연령 임계값은 -XX: MaxTenuringThreshold 매개 변수를 통해 설정할 수 있습니다.

동적 개체 연령 결정

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

공간 할당 보장

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

JDK 6 업데이트 24 이후에는 테스트 결과가 다릅니다. -XX: HandlePromotionFailure 매개변수는 더 이상 가상 머신의 공간 할당 보장 전략에 영향을 미치지 않습니다. OpenJDK의 소스 코드 변경 사항을 관찰하세요(코드 목록 3-12 참조). -XX: HandlePromotionFailure 매개 변수도 소스 코드에 정의되어 있지만 실제 가상 머신에서는 더 이상 사용되지 않습니다. JDK 6 Update 24 이후 규칙은 Old Generation의 연속 공간이 New Generation 객체의 전체 크기 또는 이전 Promotion의 평균 크기보다 큰 경우 Minor GC를 수행하고, 그렇지 않은 경우 Full GC를 수행하는 것으로 변경되었습니다. .

위 내용은 Java 메모리 관리: 할당 및 재활용 전략에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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