-XX : + UseParallelGC와 -XX ​​: + UseParNewGC의 차이점


82

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

두 번째 것 (UseParNewGC)은 동시 보유 세대 가비지 콜렉션 ( Java Concurrent 및 Parallel GC 참조)과 함께 자동으로 활성화 되지만 두 병렬 알고리즘간에 차이점이 있습니까?

답변:


119

많은 검색 끝에 내가 찾은 가장 좋은 설명은 Question of the month : 1.4.1 Garbage collection algorithms, January 29th, 2003

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

(원본) 복사 수집기 (기본적으로 활성화). 이 수집기가 시작되면 모든 응용 프로그램 스레드가 중지되고 복사 수집은 하나의 스레드를 사용하여 진행됩니다 (멀티 CPU 시스템에 있더라도 하나의 CPU 만 의미 함). 기본적으로 JVM은 수집이 완료 될 때까지 다른 모든 것을 일시 중지하기 때문에이를 stop-the-world 수집이라고합니다.

평행 복사 수집기 (-XX하여 활성화 : UseParNewGC +). 원본 복사 수집가와 마찬가지로 이것은 세계 중지 수집가입니다. 그러나이 콜렉터는 다중 스레드에 대한 복사 콜렉션을 병렬화합니다. 이는 다중 CPU 머신에 대한 원래 단일 스레드 복사 콜렉터보다 효율적입니다 (단일 CPU 머신에는 해당되지 않음). 이 알고리즘은 원래의 단일 스레드 복사 수집기와 비교할 때 사용 가능한 CPU 수와 동일한 요소로 잠재적으로 젊은 세대 수집 속도를 높입니다.

평행 소기 컬렉터 (-XX을 사용하여 활성화 : UseParallelGC). 이것은 이전의 병렬 복사 수집기와 비슷하지만 알고리즘은 다중 CPU 시스템에서 기가 바이트 힙 (10GB 이상)에 맞게 조정됩니다. 이 수집 알고리즘은 일시 중지를 최소화하면서 처리량을 최대화하도록 설계되었습니다. 힙 공간의 크기를 자동으로 조정하는 선택적 조정 조정 정책이 있습니다. 이 수집기를 사용하는 경우 이전 세대의 원래 마크 스윕 수집기 만 사용할 수 있습니다 (즉, 최신 이전 세대 동시 수집기는이 젊은 세대 수집기와 함께 작동 할 수 없음).

이 정보에서 (CMS 협력을 제외하고) 주요 차이점은 UseParallelGC가 인체 공학 을 지원 하는 반면 UseParNewGC는 지원 하지 않는다는 것입니다.



@phunehehe 링크 주셔서 감사합니다! 매우 도움이됩니다.
The Student Soul

21

병렬 GC

  • XX : + UseParallelGC 청소를 위해 병렬 가비지 수집을 사용합니다. (1.4.1에 도입 됨)
  • XX : + UseParallelOldGC 전체 컬렉션에 대해 병렬 가비지 컬렉션을 사용합니다. 이 옵션을 활성화하면 -XX : + UseParallelGC가 자동으로 설정됩니다. (5.0 업데이트 6에 도입 됨)

UseParNewGC

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

이해하는 가장 쉬운 방법은 Alexey Ragozin이 만든 가비지 수집 알고리즘의 조합 일 것입니다.

결론:

  1. YOUNG 세대 에만 병렬 수집 방법이 필요한 경우 -XX : + UseParallelGC를 적용하고 , ( 그러나 여전히) OLD 생성 수집 으로 serial-mark-sweep 방법을 사용합니다.
  2. YOUNG 생성 (-XX : + UseParallelGC 자동 설정) OLD 생성 수집에 대한 병렬 수집 방법이 필요한 경우 -XX : + UseParallelOldGC 적용
  3. 적용 -XX : + UseParNewGC 및 -XX : + UseConcMarkSweepGC 당신이 이상의 병렬 수집 방법이 필요한 젊은 세대 이상 컬렉션으로 CMS 방법을 필요로 OLD 차세대 메모리
  4. + UseParallelGC 또는 -XX : -XX와 + UseParallelOldGC : 동시에 + UseConcMarkSweepGC, 당신의 -XX이 필요한 이유는 다음과 같습니다 + UseParNewGC을 달리 -XX을 사용하여 CMS와 결합 될 : + UseSerialGC 명시 적으로 당신은 -XX 적용 할 수 없습니다 또는 -XX를 : - 젊은 세대를 상대로 시리얼 방식을 사용하고 싶다면 ParNewGC를 사용하세요.

이어야합니다 -XX:-UseParallelGC.
Minas Mina

참고 : 결론 # 1은 더 이상 정확하지 않습니다. 적용하면 -XX:+UseParallelGC최신 JVM에 대해 젊고 오래된 GC 모두에 병렬 GC를 사용하게됩니다. 참조 bugs.openjdk.java.net/browse/...
turbanoff

15

UseParNewGC는 일반적으로 "병렬 젊은 세대 수집기"로 알려진 병렬 가비지 수집기 (-XX : + UseParallelGC)와 모든면에서 동일합니다. 단, 더 정교하고 효율적입니다. 또한 "concurrent low pause collector"와 함께 사용할 수 있습니다.

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

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


8
알려진 버그 또는 버그가있는 JVM 버전을 알고 있습니까?
fglez

4

-XX : + UseParNewGC를 -XX : + UseConcMarkSweepGC와 함께 사용하면 -XX : + UseParallelGC에 비해 부 GC의 일시 중지 시간이 더 길어집니다.

이는 Young에서 Old Generation으로 개체를 승격하려면이 개체의 주소를 찾기 위해 Best-Fit 알고리즘 (구세대 조각화로 인해)을 실행해야하기 때문입니다.
-XX : + UseParallelGC를 사용할 때는 이러한 알고리즘을 실행할 필요가 없습니다. + UseParallelGC는 MarkandCompact Collector로만 구성 할 수 있으며이 경우에는 조각화가 없습니다.


이것은 정말 좋은 통찰력입니다. 이를 확인하기 위해 테스트를 수행 했습니까?
fglez
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.