JVM! 쓰레기 수거 기구!

GC heap, heap 파티션, JVM 메모리 할당 및 복구

1. 힙 공간의 기본 구조

신생대 : 에덴공간 From Survivor To Survivor space 구세대 불멸세대 (메타공간은 직접기억)

        

대부분의 경우 객체는 Eden 영역         에 먼저 할당되고 (Eden 영역의 공간이 부족하여 임계값에 도달하면 Minor GC 수행) 동시에 큰 객체는 Old Generation으로 바로 진입합니다. , long-lived 객체 는 바로 old generation으로 진입 합니다 .

        

젊은 세대 가비지 수집 메커니즘(Minor GC)

자세한 단계:

1. 새로운 객체 생성 : Java 프로그램이 새로운 객체를 생성하면 Eden 영역에 할당

2. 에덴 영역 가득 참: 에덴 영역의 개체 수가 설정된 임계값에 도달하면 가득 찬 것으로 간주됩니다.

3. 트리거 MinorGC: Eden 영역이 가득 차면 메커니즘을 트리거합니다. 이 프로세스는 모든 애플리케이션 스레드를 일시 중단하고 동시에 가비지 수집 알고리즘에 따라 젊은 세대에서 살아남은 객체를 스캔합니다.

4. 생존물체 복사 : 생존물체를 찾은 후 에덴영역과 생존자영역에서 비어있는 다른 생존자영역으로 복사한 후 나이순으로 정렬을 하게 되는데, 임계값은 이전 세대에 배치됩니다.

5. 마지막으로 사용한 Eden 영역 및 Survivor 영역 비우기: 쓰레기 수거 후 마지막으로 사용한 Eden 영역 및 Survivor 영역이 지워집니다.

6. From 영역과 To 영역이 역전됨: 다음 Minor GC 전에 S0 영역(일반적으로 From 영역)과 S1 영역(일반적으로 To 영역)이 위치를 바꿉니다. 이때 원래의 S0 영역은 새로운 To 영역이 되고, 원래의 S1 영역은 새로운 From 영역이 됩니다.

주요 단계:

1. 잔존 객체 복사: Young Generation의 가비지 콜렉션을 수행할 때 JVM(Java Virtual Machine)은 먼저 모든 잔존 객체를 찾아 Eden 영역과 Survivor 영역에서 비어 있는 다른 Survivor 영역으로 복사합니다. 동시에 이 과정에서 JVM(Java Virtual Machine)은 객체를 나이에 따라 정렬합니다. 보통은 Minor GC를 통과할 때마다 객체의 나이가 1씩 증가하는데, 복사된 객체가 Survivor 영역의 모든 공간을 차지하지 않도록 Java 가상 머신도 나이가 같거나 그 이상인 객체를 넣습니다. 이전 세대로의 문턱까지;

2. 마지막으로 사용한 Eden 영역과 Survivor 영역 비우기: 잔존 객체가 복사된 후 Java Virtual Machine은 마지막으로 사용한 Eden 영역과 Survivor 영역을 비웁니다. 이러한 방식으로 이러한 영역을 재사용할 수 있습니다.

3. From 영역과 To 영역 반전: 두 Survivor 영역을 완전히 활용할 수 있도록 하기 위해 Minor GC가 수행될 때마다 JVM(Java Virtual Machine)이 From 영역과 To 영역을 교체합니다. 따라서 다음 Minor GC 전에 원래 S0 영역(보통 From 영역)은 새로운 S1 영역이 되고 원래 S1 영역(일반적으로 To 영역)은 새로운 S0 영역이 됩니다.

개인적인 이해:

젊은 세대의 가비지 수집 메커니즘을 배송 회사에 비교할 수 있습니다.

우선 이 익스프레스 회사는 Java 가상 머신의 힙 메모리에 해당하는 대형 창고를 보유하고 있습니다. 이 창고에는 상품을 보관하는 세 개의 영역이 있습니다: Eden 영역, S0 영역 및 S1 영역. 그 중 Eden 지역은 특송 회사의 배송 지역으로 간주할 수 있으며 S0 지역과 S1 지역은 특송 회사의 두 환승역입니다.

1. 새로운 발송물이 발송되면 배송지역(즉, 에덴지역)에 투입됩니다. 배송지역이 만차일 경우 택배사는 "통관" 작업을 진행하여 아직 목적지에 도달하지 못한 상품을 모두 재포장하여 환승역(즉, S0지역 또는 S1지역)으로 발송합니다.

2. 환승역에서 택배사는 아직 목적지에 도착하지 않은 모든 상품을 걸러내고 다시 포장하여 다시 빈 환승역으로 보냅니다. 이 과정은 Young Generation에서 살아남은 객체를 복사하는 과정과 동일하다.

3. 동시에 택배 회사는 상품의 중요성과 적시성에 따라 다른 운송 방법을 마련합니다. 작은 크기, 가벼운 무게, 높은 적시성 요구 사항이 있는 상품의 경우 특송 회사는 항공 운송을 선택하고 큰 크기, 무거운 무게 및 적시성 요구 사항이 낮은 상품의 경우 육상 운송을 선택합니다.이 프로세스는 유사합니다. 젊은 세대는 구세대로 이동

4. 마지막으로 환승역을 최대한 활용할 수 있도록 특급 회사는 정기적으로 두 환승역을 교환합니다. 이러한 방식으로 각 환승 스테이션은 모든 상품을 처리할 수 있는 충분한 시간을 갖습니다. 이 과정은 From 영역과 To 영역의 반전과 같습니다.

할당 보장 메커니즘:

트리거 메커니즘: Minor GC가 발생할 때 새 세대의 모든 살아남은 개체가 여전히 이전 세대로 전송될 수 있도록 하여 메모리 할당 실패로 인한 OutOfMemoryError 예외를 방지하는 데 사용됩니다.

Minor GC가 발생할 때 Eden 영역과 Survivor 영역이 모든 생존 개체를 수용할 수 없는 경우 가상 머신은 이러한 개체( 모든 생존 개체 )를 old age로 직접 승격합니다 . 이러한 개체가 원활하게 노후 기간에 진입할 수 있도록 하려면 이때 할당 보장 메커니즘을 사용해야 합니다.

기본 개념: Minor GC를 수행하기 전에 먼저 Old Generation의 남은 공간이 승격할 객체를 수용하기에 충분한지 확인하고, 충분하면 직접 Minor GC를 수행하고, 그렇지 않으면 Full GC를 수행하여 Old Generation을 해제합니다. 더 이상 사용되지 않는 개체이며, 살아남은 모든 개체를 이전 세대로 이동합니다.

Mark-Copy Algorithm: 메모리를 같은 크기의 두 조각으로 나누고 매번 그 중 하나를 사용합니다. 이 메모리 블록이 모두 사용되면 남은 개체를 다른 블록에 복사한 다음 사용된 공간을 한 번에 정리합니다. 이러한 방식으로 각 메모리 복구는 메모리 범위의 절반을 회수합니다.

구세대 가비지 컬렉션 메커니즘

Young Generation이 Old Generation으로 진입하는 여러 상황

1. 피험자의 연령이 임계값을 초과합니다.

2. 대형 객체가 Old Generation에 직접 진입

3. 수명이 긴 물체가 노년기에 접어들다

자세한 단계:

1. 초기 표시(Initial Mark): 이 단계에서 이전 세대의 모든 객체가 순회되고 직접 참조된 모든 객체가 표시됩니다. 이 프로세스는 애플리케이션 실행을 중지해야 합니다.

2. 동시 표시: 이 단계에서 GC 스레드는 애플리케이션 스레드와 동시에 오래된 기간 동안 살아남은 모든 개체를 표시합니다. 이 프로세스는 애플리케이션 실행을 중지할 필요가 없습니다.

3. 비고(Remark): 동시 마킹이 완료된 후, 동시 마킹 동안 변경된 객체를 찾아 마킹하기 위해서는 Old Generation의 모든 객체를 다시 순회해야 한다. 이 프로세스는 애플리케이션 실행을 중지해야 합니다.

4. 동시 스윕: 이 단계에서 GC 스레드는 애플리케이션 스레드와 동시에 이전 세대의 쓸모 없는 개체를 정리하고 해당 메모리를 운영 체제에 해제합니다. 이 프로세스는 애플리케이션 실행을 중지할 필요가 없습니다.

5. 리셋 공간(컴팩트): 동시 클리어가 완료된 후 구세대에 불연속적인 메모리 공간이 많을 수 있습니다. 메모리 조각화를 줄이려면 살아남은 개체를 함께 압축하여 응용 프로그램이 사용할 더 많은 연속 공간을 확보해야 합니다.

Mark-sweep 알고리즘: Mark-sweep 알고리즘에서 가비지 수집기는 이전 세대의 모든 객체를 순회하고 모든 활성 객체를 표시합니다. 그런 다음 표시되지 않은 모든 개체는 가비지 개체로 간주되어 지워야 합니다.

단점: 이 프로세스는 지워진 개체가 차지하는 공간이 반드시 연속적이지 않아 많은 작은 공간 조각이 흩어지기 때문에 많은 메모리 조각화를 유발합니다. 새 개체의 크기가 이러한 작은 블록의 크기를 초과하면 이러한 작은 블록에 할당할 수 없으므로 메모리 할당이 실패합니다.

Mark-collation 알고리즘: 메모리 단편화 문제를 피하기 위해 노후 가비지 컬렉션에 mark-compact 알고리즘을 사용할 수 있습니다. 이 알고리즘에서 가비지 수집기는 이전 세대의 모든 개체를 순회하고 모든 활성 개체를 표시합니다. 그런 다음 모든 라이브 개체를 한쪽 끝으로 이동하여 개체가 차지하는 공간이 연속되도록 합니다.

모든 활성 개체가 한쪽 끝으로 이동되면 가비지 수집기는 이전 세대에서 표시되지 않은 모든 개체를 지우고 나머지 공간을 모두 비웁니다. 이러한 방식으로 메모리 단편화 문제를 피할 수 있고 메모리 활용도를 높일 수 있습니다.

물체가 죽었다고 판단하는 방법은 무엇입니까?

1. 참조 카운터

개체에 참조 카운터를 추가합니다. 모든 장소에서 참조 +1, 참조 무효화 -1, 0이면 죽은 것입니다.

2. 접근성 분석 알고리즘

"GC Roots" 라는 일련의 개체는 이러한 노드에서 아래쪽으로 검색하는 시작점으로 사용됩니다. 노드가 통과하는 경로를 참조 체인이라고 합니다. 개체가 참조 체인에 의해 GC Roots에 연결되지 않은 경우 다음을 증명합니다. 개체를 사용할 수 없습니다

상수가 더 이상 사용되지 않는지 어떻게 알 수 있습니까? 수업이 쓸모없는 수업인지 판단하는 방법은 무엇입니까?

1. 상수 풀에 문자열 "abc"가 존재한다면 , 현재 문자열 상수를 참조하는 문자열 객체 가 없다면 상수 "abc" 는 낡은 상수라는 뜻이다. 그런 다음 "abc"는 시스템에 의해 상수 풀에서 지워집니다.

2. 이 클래스의 모든 인스턴스가 재활용되었습니다. 즉, Java 힙에 이 클래스의 인스턴스가 없습니다. 이 클래스를 로드한 ClassLoader가 재활용되었습니다. 이 클래스에 해당하는 java.lang.Class 개체는 어디에서도 참조되지 않으며 이 클래스의 메서드는 어디에서도 리플렉션을 통해 액세스할 수 없습니다.

부모 위임 모델은 무엇입니까? 효과?

        상위 위임 모드는 Java 클래스 라이브러리의 반복 로드를 방지하고 Java 프로그램의 안정성을 보장하는 보안 메커니즘을 제공하는 Java의 ClassLoader 작동 방식입니다.

1. Java 클래스를 로드해야 하는 경우 현재 스레드의 ClassLoader가 먼저 클래스 로드를 시도합니다.

2. 사용자 정의 ClassLoader가 클래스를 찾을 수 없는 경우 처리를 위해 요청을 상위 ClassLoader에 위임합니다.

3. 상위 ClassLoader가 이 클래스를 로드할 수 없으면 부트스트랩 ClassLoader가 로드될 때까지 상위 ClassLoader에 계속 위임합니다.

4. Bootstrap ClassLoader가 클래스를 로드할 수 없으면 원래 하위 ClassLoader로 돌아가고 하위 ClassLoader는 ClassNotFoundException을 발생시킵니다.

상위 위임 모드에서 각 ClassLoader에는 상위 ClassLoader가 있습니다. 특정 클래스를 로드하기 위해 ClassLoader는 먼저 부모 ClassLoader가 이미 클래스를 로드했는지 여부를 묻고 그렇지 않은 경우 ClassLoader는 자체적으로 클래스를 로드합니다. 이러한 방식으로 공유 클래스의 개념을 JVM 전체에 구현할 수 있으므로 동일한 클래스가 반복적으로 로드되는 상황을 방지함과 동시에 프로그램의 안정성과 보안을 보장할 수 있습니다.

일반 가비지 수집기

1. 직렬 수집기 

이점:

1. 낮은 대기 시간: 단일 스레드 가비지 수집을 사용하므로 다중 스레드 동시성으로 인한 컨텍스트 전환 오버헤드를 피할 수 있으므로 낮은 대기 시간을 달성할 수 있습니다.

2. 간단하고 효율적: 간단한 구현으로 인해 너무 많은 시스템 리소스가 필요하지 않으며 가비지 개체를 빠르게 재활용할 수 있습니다.

결점:

1. 높은 동시성 시나리오에서 성능 저하: 단일 스레드에서 가비지 수집을 수행하기 때문에 높은 동시성 시나리오에서 시스템 처리량에 영향을 미치는 긴 일시 중지가 있을 수 있습니다.

2. 메모리 사용량이 많음: 가비지 콜렉션 시 전체 응용 프로세스를 독점해야 하므로 가비지 콜렉션 시간이 오래 걸리면 시스템의 메모리 사용량이 클 수 있음

장면:

  1. 작은 웹 애플리케이션
  2. 모바일 장치 응용 프로그램
  3. 개발 단계에서의 테스트 환경

연산:

  1. 마킹 단계: 루트 노드에서 객체 그래프를 순회하고 참조된 모든 객체를 표시합니다.
  2. 정리 단계: 힙 메모리의 모든 개체를 순회하고 표시되지 않은 개체를 재활용합니다.

2.Serial 올드 컬렉터

이점:

  1. 구현이 간단하고 코드 양이 적기 때문에 작업 효율성이 높습니다.
  2. 메모리 사용량이 적어 메모리가 적은 환경에 적합합니다.
  3. 직렬 수집기와 함께 사용하여 연속적인 가비지 수집기 조합이 될 수 있습니다.
  4. 소규모 애플리케이션이나 소량의 데이터가 있는 애플리케이션의 경우 Serial Old가 우수한 성능을 보일 수 있습니다.

결점:

1. 싱글 스레딩으로 인해 멀티 코어 CPU의 장점을 충분히 활용할 수 없으며 많은 양의 데이터를 처리해야 할 때 STW 시간이 너무 길어질 수 있습니다.

2. 표시 정렬 알고리즘은 큰 개체를 이동해야 하기 때문에 큰 개체를 처리할 때 추가 오버헤드가 필요하며 이는 가비지 수집기의 효율성에도 영향을 미칩니다.

장면:

  1. 단일 코어 CPU 환경의 애플리케이션
  2. 작업 세트가 작고 데이터 양이 많지 않기 때문에 작은 응용 프로그램;
  3. 높은 시작 속도가 필요한 애플리케이션용

연산:

        복구 후 공간이 연속되도록 보장할 수 있는 마크 정렬 알고리즘으로 조각 생성을 줄입니다. 그러나 이 알고리즘은 살아남은 개체를 메모리의 다른 세그먼트에 복사해야 하고 살아남은 모든 개체를 표시해야 하므로 많은 양의 데이터를 처리할 때 STW 시간이 너무 길어집니다.

3. ParNew 컬렉터

이점:

  1. 다중 스레드 병렬 처리: 다중 스레드를 사용하여 동시에 가비지 수집을 수행하면 다중 코어 CPU의 성능을 최대한 활용하고 가비지 수집 효율성을 높일 수 있습니다.

  2. 낮은 대기 시간: ParNew 수집기는 마크 복사 알고리즘을 채택하여 힙 메모리를 Young Generation과 Old Generation으로 나누고 Young Generation만 회수합니다. Young Generation은 힙 메모리를 덜 차지하기 때문에 가비지 수집 속도가 빨라져 대기 시간을 줄일 수 있습니다.

  3. CMS 컬렉터와 함께 사용: ParNew 컬렉터는 일반적으로 Young Generation의 병렬 수집을 위해 CMS 컬렉터와 함께 사용되며, CMS 컬렉터는 Old Generation의 동시 수집을 담당하므로 효율성과 낮은 전체 가비지 수집 프로세스의 대기 시간

결점:

  1. Young Generation 가비지 컬렉션에만 적용 가능: ParNew 컬렉터는 Old Generation이 아닌 Young Generation에서만 가비지를 수집할 수 있습니다.

  2. STW 작업의 단일 스레드 실행: 젊은 세대 가비지 수집을 수행할 때 애플리케이션(STW)의 모든 스레드를 일시 중지해야 합니다. 이 작업은 하나의 스레드만 완료할 수 있으므로 일시 중지 시간이 길어질 수 있습니다.

장면:

        대기 시간이 짧고 처리량이 높은 시나리오

연산:

        마크 복사 알고리즘

4. CMS 수집기

이점:

  1. Low pause time: CMS 컬렉터는 mark-clear 알고리즘을 채택하여 가비지 컬렉션을 수행할 때 애플리케이션의 모든 스레드(STW)를 일시 중지할 필요가 없으며 애플리케이션이 실행되는 동안 가비지 컬렉션을 수행할 수 있으므로 짧은 일시 중지 시간을 보장합니다. .

  2. 높은 처리량: CMS 수집기는 동시 수집 알고리즘을 채택하므로 애플리케이션이 실행되는 동안 여러 스레드를 가비지 수집에 사용할 수 있어 높은 처리량을 보장합니다.

  3. 완전 자체 적응형: CMS 수집기는 애플리케이션의 실행 조건에 따라 가비지 수집 전략을 동적으로 조정하여 최상의 가비지 수집 효과와 성능을 보장할 수 있습니다.

결점:

  1. 메모리 단편화 문제: CMS 컬렉터는 마크 지우기 알고리즘을 사용하기 때문에 힙 메모리에서 대량의 메모리 단편화가 발생하여 애플리케이션 성능에 영향을 미칠 수 있습니다.

  2. 동시 실행으로 인한 오버헤드: CMS 컬렉터가 가비지 컬렉션을 동시에 실행할 때 일정량의 CPU 리소스와 메모리 공간을 소비해야 하므로 애플리케이션 성능에 어느 정도 영향을 미칠 수 있습니다.

장면:

        짧은 일시 중지 시간과 높은 처리량이 필요한 시나리오에 적합하며 일반적으로 ParNew 수집기와 함께 사용됩니다.

연산:

        마크 스윕 알고리즘

5. 병렬 스캐빈 지 컬렉터

이점:

  1. 높은 처리량: Parallel Scavenge 수집기는 여러 CPU 코어를 활용하여 가비지 수집 작업을 병렬로 실행하여 높은 처리량을 보장할 수 있습니다.

  2. 짧은 STW 시간: Parallel Scavenge 수집기는 마크 복사 알고리즘과 세대별 가비지 수집 전략을 사용하여 STW 시간을 어느 정도 줄일 수 있습니다.

  3. 적응형 조정: Parallel Scavenge 수집기는 현재 시스템 부하에 따라 가비지 수집 전략을 자동으로 조정하여 최상의 가비지 수집 효과와 성능을 달성할 수 있습니다.

결점:

  1. 메모리 공간 사용 문제: Parallel Scavenge 컬렉터는 마크 복사 알고리즘을 채택하고 개체를 저장하기 위해 동일한 크기의 두 개의 메모리 공간을 할당해야 하므로 힙 공간이 작은 응용 프로그램에서 메모리 부족 문제가 발생할 수 있습니다.

  2. 장기 실행 응용 프로그램에 적합하지 않음: Parallel Scavenge 수집기는 주로 차세대 가비지 수집에 사용되므로 장기 실행 응용 프로그램에는 적합하지 않습니다.

장면:

  1. 애플리케이션의 처리량 요구 사항이 높습니다. Parallel Scavenge 수집기가 가비지 수집을 수행할 때 가능한 한 많은 CPU 코어를 사용하고 STW 시간을 줄여 애플리케이션의 처리량을 향상시킵니다.

  2. 응용 프로그램의 응답 시간 요구 사항이 낮음: Parallel Scavenge 수집기는 STW 시간을 줄이기 위해 특별히 설계되지 않았지만 마크 복사 알고리즘 및 세대별 가비지 수집 전략을 사용하여 STW 시간을 어느 정도 줄일 수 있습니다.

연산:

        마크 복사 알고리즘

6. 병렬 이전 수집기

이점:

  1. 높은 처리량: Parallel Old 수집기는 여러 CPU 코어를 활용하여 가비지 수집 작업을 병렬로 실행하여 높은 처리량을 보장할 수 있습니다.

  2. STW 시간 단축: Parallel Old 수집기는 가비지 수집 중에 메모리 공간을 구성할 수 있는 마크 정렬 알고리즘을 사용하여 STW 시간을 줄입니다.

  3. 적응형 조정: Parallel Old 수집기는 현재 시스템 부하에 따라 가비지 수집 전략을 자동으로 조정하여 최상의 가비지 수집 효과와 성능을 달성할 수 있습니다.

결점:

  1. 메모리 공간 사용 문제: Parallel Old 컬렉터는 마크 정렬 알고리즘을 사용하기 때문에 가비지 컬렉션을 수행할 때 전체 힙 공간을 정렬해야 하므로 많은 메모리 공간이 필요합니다.

  2. 장기 실행 애플리케이션에 적합하지 않음: Parallel Old 컬렉터는 구세대에서 주로 가비지 수집에 사용되므로 장기 실행 애플리케이션에는 적합하지 않습니다.

장면:

  1. 애플리케이션의 높은 처리량 요구 사항: 가비지 수집 작업을 병렬로 실행함으로써 Parallel Old 수집기는 여러 CPU 코어를 최대한 활용하고 STW 시간을 줄여 애플리케이션 처리량을 향상시킬 수 있습니다.

  2. 응용 프로그램에는 큰 힙 공간 요구 사항이 있습니다. Parallel Old 수집기는 마크 정렬 알고리즘을 채택하기 때문에 가비지 수집 프로세스 중에 메모리 공간을 구성할 수 있으므로 메모리 조각화를 줄일 수 있으며 대용량 힙 공간이 필요한 응용 프로그램에 적합합니다.

연산:

        마크 조합 알고리즘

7. G1 컬렉터

이점:

  1. 예측 가능한 일시 중지 시간: G1 수집기는 세대별 가비지 수집 전략과 동시 가비지 수집 알고리즘을 채택하여 STW 시간을 어느 정도 줄이고 예측 가능한 일시 중지 시간을 보장할 수 있습니다.

  2. 높은 처리량: G1 수집기는 동시에 여러 개의 작은 가비지 수집 작업을 수행할 수 있으므로 높은 처리량을 보장합니다.

  3. 메모리 공간 사용의 고효율: G1 수집기는 마크 정렬 알고리즘과 세대별 가비지 수집 전략을 채택하기 때문에 메모리 공간 낭비를 어느 정도 줄이고 메모리 공간 사용 효율성을 향상시킬 수 있습니다.

결점:

  1. 다른 수집기와 비교할 때 G1 수집기는 더 많은 CPU 리소스와 메모리 공간을 사용합니다.

  2. 수명이 짧은 많은 개체를 처리하는 시나리오에서 G1 수집기는 CMS와 같은 동시 수집기만큼 성능이 좋지 않을 수 있습니다.

장면:

  1. 대용량 메모리 요구 사항이 있는 응용 프로그램: G1 수집기는 전체 힙 공간을 가비지 수집하고 구성할 수 있으므로 큰 힙 공간이 필요한 응용 프로그램에 적합합니다.

  2. 응용 프로그램의 대기 시간 요구 사항이 낮음: G1 수집기는 동시 가비지 수집 알고리즘과 세대별 가비지 수집 전략을 채택하여 STW 시간을 어느 정도 줄이고 낮은 대기 시간을 보장할 수 있습니다.

연산:

        마크 조합 알고리즘

추천

출처blog.csdn.net/weixin_64625868/article/details/131026573