CodeGym /Java Course /모듈 3 /세대별 가비지 컬렉션

세대별 가비지 컬렉션

모듈 3
레벨 18 , 레슨 4
사용 가능

개체 세대 작업

Java 가비지 수집기는 수명별로 개체를 분류할 수 있는 세대별 가비지 수집 전략을 구현합니다.

JVM에서 이러한 요구(모든 객체를 표시하고 압축해야 함)는 비효율적이라고 할 수 있습니다. 많은 수의 개체가 할당되면 해당 목록이 늘어나 가비지 수집 시간이 늘어납니다. 응용 프로그램에 대한 경험적 분석에 따르면 Java의 대부분의 개체는 수명이 짧습니다.

JVM의 힙 메모리 영역은 세 부분으로 나뉩니다.

개체 세대 작업

젊은 세대

새로 생성된 개체는 젊은 세대에서 시작됩니다. 젊은 세대는 다시 두 부류로 나뉜다.

  • Eden Space - 모든 새 개체가 여기에서 시작되며 초기 메모리가 할당됩니다.
  • Survivor Spaces (FromSpace 및 ToSpace) - 개체는 하나의 가비지 수집 주기에서 살아남은 후 Eden에서 여기로 이동됩니다.

객체가 젊은 세대로부터 가비지 수집되는 과정을 마이너 가비지 수집 이벤트라고 합니다.

Eden의 공간이 개체로 채워지면 작은 가비지 수집이 수행됩니다. 모든 죽은 개체는 제거되고 모든 살아있는 개체는 나머지 두 공간 중 하나로 이동됩니다. 작은 GC는 또한 서바이버 공간의 객체를 확인하고 다른(다음) 서바이버 공간으로 이동합니다.

다음 순서를 예로 들어 보겠습니다.

  1. 에덴에는 두 가지 유형(산 것과 죽은 것)의 물체가 있습니다.
  2. 작은 GC가 발생합니다. 모든 죽은 개체가 Eden에서 제거됩니다. 모든 살아있는 개체는 공간-1(FromSpace)로 이동합니다. Eden과 space-2는 이제 비어 있습니다.
  3. 새로운 객체가 생성되어 Eden에 추가됩니다. Eden과 space-1의 일부 개체가 죽습니다.
  4. 작은 GC가 발생합니다. 모든 죽은 개체가 Eden과 space-1에서 제거됩니다. 모든 살아있는 개체는 공간-2(ToSpace)로 이동됩니다. Eden과 space-1은 비어 있습니다.

따라서 언제든지 생존자 공간 중 하나는 항상 비어 있습니다. 생존자가 생존자 공간을 통해 이동하기 위한 특정 임계값에 도달하면 이전 세대로 이동합니다.

-Xmn 플래그를 사용하여 젊은 세대 크기를 설정할 수 있습니다 .

이전 세대

상당한 시간 동안(예: 프로그램 수명의 대부분) 살아있는 개체는 결국 오래된 개체(100세 이상)가 됩니다. 일반 세대라고도 하며 오랫동안 생존자 공간에 남아 있던 개체를 포함합니다.

개체의 수명 임계값은 개체가 이전 세대로 이동되기 전에 거쳐야 하는 가비지 수집 주기 수를 결정합니다. 객체가 이전 세대에서 가비지로 보내지는 과정을 메인 가비지 수집 이벤트라고 합니다.

-Xms-Xmx 플래그를 사용하여 초기 및 최대 힙 메모리 크기를 설정할 수 있습니다 .

Java는 세대별 가비지 수집을 사용하기 때문에 개체가 더 많은 가비지 수집 이벤트를 경험할수록 힙에서 더 많이 이동합니다. 그는 젊은 세대에서 시작하여 충분히 오래 살면 결국 정규 세대로 끝납니다.

공간과 세대 간의 개체 홍보를 이해하려면 다음 예를 고려하십시오.

객체가 생성되면 먼저 Young Generation의 Eden 공간에 배치됩니다.

작은 가비지 수집이 발생하는 즉시 Eden의 살아있는 개체가 FromSpace로 이동됩니다. 다음 사소한 가비지 수집이 발생하면 Eden과 우주의 살아있는 개체가 ToSpace로 이동됩니다.

이 주기는 특정 횟수만큼 계속됩니다. 이 시점 이후에도 개체가 여전히 "서비스 중"이면 다음 가비지 수집 주기에서 개체를 이전 세대 공간으로 이동합니다.

영구 생성 및 메타스페이스

클래스 및 메서드와 같은 메타데이터는 영구 생성에 저장됩니다. JVM은 애플리케이션에서 사용하는 클래스를 기반으로 런타임 시 이를 채웁니다. 더 이상 사용되지 않는 클래스는 영구 생성에서 가비지로 이동할 수 있습니다.

-XX:PermGen-XX:MaxPermGen 플래그를 사용하여 영구 생성의 초기 및 최대 크기를 설정할 수 있습니다 .

메타 공간

Java 8부터 PermGen 공간은 MetaSpace 메모리 공간으로 대체되었습니다. 구현은 PermGen과 다릅니다. 이 힙 공간은 이제 자동으로 변경됩니다.

이렇게 하면 PermGen 힙 공간의 제한된 크기로 인해 발생하는 애플리케이션의 메모리 부족 문제를 피할 수 있습니다. 메타스페이스 메모리는 가비지 수집될 수 있으며 더 이상 사용하지 않는 클래스는 메타스페이스가 최대 크기에 도달하면 자동으로 정리됩니다.

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION