source

-XX의 차이:+ParallelGC 및 -XX 사용:+UseParNewGC

gigabyte 2023. 1. 22. 22:28
반응형

-XX의 차이:+ParallelGC 및 -XX 사용:+UseParNewGC

젊은 세대의 가비지 수집 알고리즘입니다.

두 번째 것(UseParNewGC)은 동시 테넌트 생성 가비지 컬렉션(Java Concurrent GC 및 Parallel GC 참조)과 함께 자동으로 활성화 됩니다만, 2개의 병렬 알고리즘에 차이가 있습니까?

여러 번 검색한 결과, 가장 좋은 설명은 이 달의 문제의 Java Performance Tuning 웹사이트: 1.4.1 가비지 컬렉션 알고리즘, 2003년 1월 29일

젊은 세대의 가비지 수집 알고리즘

(original) 복사 수집기(디폴트로 유효)이 수집기가 시작되면 모든 응용 프로그램 스레드가 중지되고 복사 수집이 하나의 스레드(멀티 CPU 머신에 있는 경우에도 CPU가 1개뿐임을 의미)를 사용하여 계속됩니다.기본적으로 수집이 완료될 때까지 JVM이 다른 모든 작업을 일시 중지하기 때문에 이를 Stop-the-World 수집이라고 합니다.

병렬 복사 수집기(-XX를 사용하여 사용 가능:+UseParNewGC)원래의 복사 수집기와 마찬가지로, 이것은 Stop-the-World 수집기입니다.단, 이 컬렉터는 복사 컬렉션을 여러 스레드에 걸쳐 병렬화합니다.이는 멀티 CPU 머신의 경우(단, 싱글 CPU 머신의 경우 제외) 원래의 싱글 스레드 복사 컬렉터보다 효율적입니다.이 알고리즘은 원래 싱글 스레드 복사 수집기와 비교하여 사용 가능한 CPU 수와 동일한 계수만큼 젊은 세대의 수집 속도를 높일 수 있습니다.

병렬 청소 수집기(-XX를 사용하여 활성화됨:ParallelGC를 사용합니다).이는 이전의 병렬 복사 수집기와 비슷하지만 알고리즘은 멀티 CPU 머신에서 기가바이트 힙(10GB 초과)에 맞게 조정됩니다.이 수집 알고리즘은 일시 정지를 최소화하면서 throughput을 최대화할 수 있도록 설계되었습니다.옵션 적응형 튜닝 정책이 있어 힙 공간의 크기가 자동으로 조정됩니다.이 컬렉터를 사용하는 경우 구세대의 원래 마크 스위프 컬렉터만 사용할 수 있습니다(즉, 새로운 구세대 동시 컬렉터는 이 젊은 세대 컬렉터에서는 사용할 수 없습니다).

이 정보로부터 (CMS의 제휴와는 별개로) UseParallelGC는 인체 공학을 지원하지만 UseParNewGC는 지원하지 않는 것이 큰 차이인 것 같습니다.

병렬 GC

  • XX:+UseParallelGC 스캐빈지에 병렬 가비지 컬렉션을 사용합니다.(1.4.1에서 도입)
  • XX:+UseParallelOldGC 전체 컬렉션에 병렬 가비지 컬렉션을 사용합니다.이 옵션을 활성화하면 자동으로 -XX가 설정됩니다.+ParallelGC 사용(5.0 업데이트 6에서 도입)

UseParNewGC

UseParNewGC 젊은 세대 복사 수집기의 병렬 버전이 동시 수집기와 함께 사용됩니다(즉, 명령줄에서 -XX:+ UseConcMarkSweepGC가 사용되는 경우, 명령줄에서 명시적으로 설정되지 않은 경우 플래그 UseParNewGC도 true로 설정됩니다).

아마도 가장 이해하기 쉬운 방법은 알렉세이 라고진이 만든 가비지 수집 알고리즘의 조합일 것이다.

<table border="1" style="width:100%">
  <tr>
    <td align="center">Young collector</td>
    <td align="center">Old collector</td>
    <td align="center">JVM option</td>
  </tr>
  <tr>
    <td>Serial (DefNew)</td>
    <td>Serial Mark-Sweep-Compact</td>
    <td>-XX:+UseSerialGC</td>
  </tr>
  <tr>
    <td>Parallel scavenge (PSYoungGen)</td>
    <td>Serial Mark-Sweep-Compact (PSOldGen)</td>
    <td>-XX:+UseParallelGC</td>
  </tr>
  <tr>
    <td>Parallel scavenge (PSYoungGen)</td>
    <td>Parallel Mark-Sweep-Compact (ParOldGen)</td>
    <td>-XX:+UseParallelOldGC</td>
  </tr>
  <tr>
    <td>Serial (DefNew)</td>
    <td>Concurrent Mark Sweep</td>
    <td>
      <p>-XX:+UseConcMarkSweepGC</p>
      <p>-XX:-UseParNewGC</p>
    </td>
  </tr>
  <tr>
    <td>Parallel (ParNew)</td>
    <td>Concurrent Mark Sweep</td>
    <td>
      <p>-XX:+UseConcMarkSweepGC</p>
      <p>-XX:+UseParNewGC</p>
    </td>
  </tr>
  <tr>
    <td colspan="2">G1</td>
    <td>-XX:+UseG1GC</td>
  </tr>
</table>

결론:

  1. -XX 적용:+YOUNG 세대만의 병렬 수집 방식이 필요한 경우 ParallelGC를 사용하되, 구세대 컬렉션으로 시리얼 마크 스위프 방식을 사용합니다.
  2. -XX 적용:+YOUNG 생성에 대한 병렬 수집 방법이 필요한 경우 Parallel Old GC를 사용합니다(자동으로 -XX 설정:+ParallelGC 사용) 구세대 컬렉션
  3. -XX 적용:+UseParNewGC 및 -XX:+YOUNG 세대보다 병렬 수집 방식이 필요하고 구세대 메모리보다 CMS 방식이 필요한 경우 ConcMarkSweepGC 사용
  4. -XX를 적용할 수 없습니다.+ParallelGC 또는 -XX 사용:+XX와 함께 Parallel Old GC 사용:+UseConcMarkSweepGC를 동시에 사용하므로 -XX:+CMS와 쌍을 이루려면 UseParNewGC를 사용하십시오. 그렇지 않으면 -XX:+시리얼 GC를 명시적으로 사용 또는 -XX:-젊은 세대에 대해 시리얼 메서드를 사용하는 경우

일반적으로 "병렬 젊은 세대 수집기"로 알려진 UseParNewGC는 더 정교하고 효율적이라는 점을 제외하고 모든 면에서 병렬 가비지 수집기(-XX:+UseParallelGC)와 동일합니다.또, 「동시 저포즈 콜렉터」에서도 사용할 수 있습니다.

자세한 내용은 Java GC FAQ, 질문 22를 참조하십시오.

UseParNewGC에는 몇 가지 알려진 버그가 있습니다.

-XX 사용:+XX와 함께 ParNewGC 사용:+UseConcMarkSweepGC는 -XX에 비해 마이너 GC의 포즈 시간이 길어집니다.+ParallelGC를 사용합니다.

이는 Young Generation에서 Old Generation으로 오브젝트를 승격하려면 (구세대 플래그멘테이션으로 인해) Best-Fit 알고리즘을 실행하여 이 오브젝트의 주소를 찾아야 하기 때문입니다.
-XX 를 사용하는 경우는, 이러한 알고리즘을 실행할 필요는 없습니다.+ParallelGC를 사용합니다.+ParallelGC는 MarkandCompact Collector에서만 구성할 수 있습니다.이 경우 플래그멘테이션이 발생하지 않습니다.

언급URL : https://stackoverflow.com/questions/2101518/difference-between-xxuseparallelgc-and-xxuseparnewgc

반응형