G1에 대한 Java 7 (JDK 7) 가비지 콜렉션 및 문서


82

Java 7 은 한동안 출시 되었지만 가비지 수집기 , 특히 새로운 G1 수집기 의 구성에 대한 좋은 리소스를 찾을 수 없습니다 .

내 질문 :

  1. G1은 Java 7의 기본 수집기이며 그렇지 않은 경우 어떻게 G1을 활성화합니까?
  2. Java7에서 g1의 선택적 설정은 무엇입니까?
  3. cms 또는 Java 7 의 병렬 수집기 와 같은 다른 수집기에 변경 사항이 있습니까?
  4. Java 7의 가비지 컬렉션에 대한 좋은 문서는 어디에서 찾을 수 있습니까?

6
G1 Garbage Collector 시작하기는 모범 사례와 함께 좋은 개요도 제공합니다.
John McCarthy

답변:


47

G1 가비지 수집기는 Java 버전 1.7.0_01의 기본값이 아닙니다. 몇 가지 추가 명령 줄 옵션을 사용하여 직접 확인할 수 있습니다.

> java -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -version
-XX:InitialHeapSize=132304640 -XX:MaxHeapSize=2116874240 -XX:ParallelGCThreads=4 -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
java version "1.7.0_01"
Java(TM) SE Runtime Environment (build 1.7.0_01-b08)
Java HotSpot(TM) 64-Bit Server VM (build 21.1-b02, mixed mode)
Heap
 PSYoungGen      total 37696K, used 1293K [0x00000007d5eb0000, 0x00000007d88c0000, 0x0000000800000000)
  eden space 32320K, 4% used [0x00000007d5eb0000,0x00000007d5ff3408,0x00000007d7e40000)
  from space 5376K, 0% used [0x00000007d8380000,0x00000007d8380000,0x00000007d88c0000)
  to   space 5376K, 0% used [0x00000007d7e40000,0x00000007d7e40000,0x00000007d8380000)
 PSOldGen        total 86144K, used 0K [0x0000000781c00000, 0x0000000787020000, 0x00000007d5eb0000)
  object space 86144K, 0% used [0x0000000781c00000,0x0000000781c00000,0x0000000787020000)
 PSPermGen       total 21248K, used 2032K [0x000000077ca00000, 0x000000077dec0000, 0x0000000781c00000)
  object space 21248K, 9% used [0x000000077ca00000,0x000000077cbfc288,0x000000077dec0000)

하지만 더 이상 G1 수집기를 켜기 위해 실험 옵션을 활성화 할 필요는 없습니다.

> java -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseG1GC -version
-XX:InitialHeapSize=132304640 -XX:MaxHeapSize=2116874240 -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseCompressedOops -XX:+UseG1GC -XX:-UseLargePagesIndividualAllocation
java version "1.7.0_01"
Java(TM) SE Runtime Environment (build 1.7.0_01-b08)
Java HotSpot(TM) 64-Bit Server VM (build 21.1-b02, mixed mode)
Heap
 garbage-first heap   total 130048K, used 0K [0x000000077ca00000, 0x0000000784900000, 0x00000007fae00000)
  region size 1024K, 1 young (1024K), 0 survivors (0K)
 compacting perm gen  total 20480K, used 2032K [0x00000007fae00000, 0x00000007fc200000, 0x0000000800000000)
   the space 20480K,   9% used [0x00000007fae00000, 0x00000007faffc288, 0x00000007faffc400, 0x00000007fc200000)
No shared spaces configured.

좋은 문서를 어디서 찾을 수 있는지 모르겠습니다.


2
이것은 OSX에서 1.7.0_09에 대해 여전히 유효합니다
Age Mooij

1
Linux의 1.7.0_10에서 동일
Marc Polizzi

Oracle 웹 사이트에서 직접 가져온 linux / amd64의 Oracle JDK 7u17에는 해당되지 않습니다. 그것은 말한다 -XX:+UseParallelGC.
user1050755 2013 년

31

Oracle은 마침내 Java 7 U4에서 G1을 공식화했습니다. http://www.oracle.com/technetwork/java/javase/7u4-relnotes-1575007.html

설명 : http://docs.oracle.com/javase/7/docs/technotes/guides/vm/G1.html

명령 줄 옵션 : http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html#G1Options

그래도 Java 7의 기본 수집기라고 생각하지 않습니다. 서버의 경우 기본값은 Java 6에서와 같이 Parallel Collector입니다.


1
서버는 2 개의 코어와 2GB RAM 이상으로 정의됩니다. 자세한 내용은 hg.openjdk.java.net/jdk7u/jdk7u/hotspot/file/0d82bf449a61/src 를 통해 찾을 수 있습니다. ./share/tools/launcher/java.c 및 ./share/vm/runtime/ 파일을보십시오. os.cpp
user1050755

22

예, G1은 Java 1.7 JVM의 새로운 표준 가비지 수집기입니다.

여기 에서 새 가비지 수집기를 사용하고 구성하는 방법에 대한 많은 정보를 찾을 수 있습니다.

G1 사용 G1은 여전히 ​​실험적인 것으로 간주되며 다음 두 가지 매개 변수를 사용하여 활성화 할 수 있습니다.

-XX : + UnlockExperimentalVMOptions -XX : + UseG1GC

GC 일시 중지 시간 목표를 설정하려면 다음 매개 변수를 사용하십시오.

-XX : MaxGCPauseMillis = 50 (일시 중지 시간 목표가 50ms 인 경우)

G1을 사용하면 GC 일시 중지가 위에 제공된 시간보다 오래 지속되지 않는 시간 간격을 지정할 수 있습니다.

-XX : GCPauseIntervalMillis = 200 (일시 중지 간격 목표가 200ms 인 경우)

위의 두 옵션은 약속이나 보장이 아닌 목표를 나타냅니다. 어떤 상황에서는 잘 작동하지만 다른 상황에서는 잘 작동하지 않을 수 있으며 GC가 항상이를 준수 할 수있는 것은 아닙니다.

또는 대피 일시 중지 시간에 영향을 미치기 위해 젊은 세대의 크기를 명시 적으로 지정할 수 있습니다.

-XX : + G1YoungGenSize = 512m (512MB 젊은 세대의 경우)

G1은 또한 당연히 일련의 (잠재적으로 비 연속적) 영역 인 생존자 공간에 해당하는 공간을 사용합니다. 크기는 일반적인 매개 변수 (예 : -XX : SurvivorRatio = 6)로 지정할 수 있습니다.

마지막으로 G1을 최대한 활용하려면 드문 경쟁 조건을 발견 할 수 있으므로 현재 기본적으로 비활성화되어있는 다음 두 매개 변수를 설정해보십시오.

-XX : + G1ParallelRSetUpdatingEnabled -XX : + G1ParallelRSetScanningEnabled

한 가지 더 주목할 점은 -XX : + PrintGCDetails가 설정된 경우 G1이 다른 HotSpot GC에 비해 매우 장황하다는 것입니다. 이는 프로파일 링 및 문제 해결에 매우 도움이되는 GC 스레드 별 타이밍 및 기타 정보를 인쇄하기 때문입니다. 보다 간결한 GC 로그를 원하면 -verbosegc 사용으로 전환하십시오 (더 자세한 GC 로그를 얻는 것이 좋습니다).

또한 기사는 G1의 내부를 이해하는 데 매우 도움이됩니다.

여기에 더 많은 정보가 있습니다 .


6
나는 이러한 자원을 보았다. 그러나 첫 번째 기사는 아직 실험적인 옵션이었을 때 JDK 6의 G1에 관한 것입니다. 다른 기사는 JDK 7의 베타 릴리스 및 최소 1 년에 관한 것입니다. Oracle 또는 JDK 팀의 최신 정보 또는 공식 문서를 찾고 있습니다.
Florakel 2011

13

1. G1이 Java 7의 기본 수집기입니까? (...)

이 Java 5 페이지 의 규칙 은 Java 7 (및 AFAIK, Java 8)에서 계속 적용됩니다.

서버급 병렬 콜렉터 (-XX : + UseParallelGC) 서버 VM을 실행하는 시스템, 가비지 컬렉터 (GC)는 이전의 일련 콜렉터 (+ UseSerialGC - XX)로 변경 하였다.

그러나 다음 사항도 고려하십시오.

  • 64 비트 JVM은 -clientVM 과 함께 제공되지 않으므로 항상 "서버 클래스"입니다.
  • Java 7부터 -XX : + UseParallelGC (설정 여부에 관계없이)를 사용하면 -XX : + UseParallelOldGC (즉, 명시 적으로 비활성화되지 않은 경우)가 추가로 의미됩니다.

예를 들어 Windows x64에서 실행하는 경우 ...

  • Java 7 64 비트의 경우 기본적으로 Parallel GC (젊은 세대 및 이전 세대 모두)가 제공됩니다.
  • Java 8 32 비트, 기본적으로 직렬 GC (두 세대 모두)를받습니다.

1. (...) G1을 어떻게 활성화합니까?

Java 7부터 간단히 -XX:+UseG1GC. 아마 또한 정보입니다 당신이 원하는 것 :

현재 CMS 또는 ParallelOld 가비지 수집기로 실행되는 응용 프로그램은 응용 프로그램에 다음 특성 중 하나 이상이있는 경우 G1로 전환하는 데 도움이됩니다.

  • Java 힙의 50 % 이상이 라이브 데이터로 채워져 있습니다.
  • 개체 할당 비율 또는 승격 비율은 크게 다릅니다.
  • 원하지 않는 긴 가비지 수집 또는 압축 일시 중지 (0.5 ~ 1 초 이상)

2. Java7에서 g1의 선택적 설정은 무엇입니까?

나는 G1에게 자신을 사용하지 않는했지만, 내가 수집 이 같은 기본을 준수하는 것이 "처리량 / 인체 공학적"다른 병렬 수집 조정에 사용되는 플래그. Parallel GC에 대한 제 경험상 -XX:GCTimeRatio예상되는 속도 메모리 트레이드 오프를 제공하는 데 중추적 인 역할을했습니다. YMMV.

G1 관련 옵션이 여기 에 나열 됩니다.

3. Java 7에서 (...) cms 또는 병렬 수집기가 변경 되었습니까?

알고하지 않습니다 하지만 ...

G1은 CMS (Concurrent Mark-Sweep Collector)의 장기 교체로 계획됩니다.

4. Java 7의 가비지 콜렉션에 대한 좋은 문서는 어디에서 찾을 수 있습니까?

찾는 것이 고통스럽지 않습니까? 아마도 내가 찾은 최고의 "허브"페이지는 다음과 같습니다.

http://www.oracle.com/technetwork/java/javase/tech/index-jsp-140228.html

약간의 심층 읽기가 필요하지만 약간의 조정이 필요한 경우 시간을 할애 할 가치가 있습니다. 특히 통찰력있는 것은 가비지 수집기 인체 공학입니다.


13
  1. G1은 Java 7의 기본 수집기이며 그렇지 않은 경우 어떻게 G1을 활성화합니까?

G1은 Java 7의 기본 수집기가 아닙니다. -XX:+UseG1GCG1GC를 활성화합니다.

  1. Java7에서 g1의 선택적 설정은 무엇입니까?

많이있다. 전체 정보 는이 오라클 기사를 참조하십시오.

G1 GC는 수정없이 효율적으로 작동 할 수 있도록 기본값이있는 적응 형 가비지 수집기입니다.

이러한 이유로 중요한 매개 변수를 사용자 정의하십시오.

-XX:MaxGCPauseMillis
-XX:G1HeapRegionSize
-XX:ParallelGCThreads
-XX:ConcGCThreads

다른 모든 매개 변수는 기본값으로 둡니다 .

다음은 중요한 옵션 및 기본값 목록입니다. 이 목록은 최신 Java HotSpot VM, 빌드 24에 적용됩니다. JVM 명령 줄에서 G1 GC 설정을 조정하고 조정할 수 있습니다.

중요한 기본값 :

-XX:G1HeapRegionSize=n

G1 영역의 크기를 설정합니다. 값은 2의 제곱이며 1MB에서 32MB까지입니다. 목표는 최소 Java 힙 크기를 기준으로 약 2048 개의 리전을 갖는 것입니다.

-XX:MaxGCPauseMillis=200

원하는 최대 일시 중지 시간에 대한 목표 값을 설정합니다. 기본값은 200 밀리 초입니다. 지정된 값이 힙 크기에 맞지 않습니다.

-XX:G1NewSizePercent=5

젊은 세대 크기에 대한 최소값으로 사용할 힙 백분율을 설정합니다. 기본값은 Java 힙의 5 %입니다.

-XX:G1MaxNewSizePercent=60

젊은 세대 크기의 최대 값으로 사용할 힙 크기의 백분율을 설정합니다. 기본값은 Java 힙의 60 %입니다.

-XX:ParallelGCThreads=n

STW 작업자 스레드의 값을 설정합니다. n의 값을 논리 프로세서 수로 설정합니다. n의 값은 최대 8의 논리 프로세서 수와 동일합니다.

논리 프로세서가 8 개 이상인 경우 n 값을 논리 프로세서의 약 5/8로 설정합니다. 이는 n 값이 논리 프로세서의 약 5/16 일 수있는 더 큰 SPARC 시스템을 제외한 대부분의 경우에서 작동합니다.

-XX:ConcGCThreads=n

병렬 마킹 스레드 수를 설정합니다. n을 병렬 가비지 콜렉션 스레드 수 (ParallelGCThreads)의 약 1/4로 설정합니다.

-XX:InitiatingHeapOccupancyPercent=45

표시주기를 트리거하는 Java 힙 점유 임계 값을 설정합니다. 기본 점유율은 전체 Java 힙의 45 %입니다.

-XX:G1MixedGCLiveThresholdPercent=65

혼합 가비지 콜렉션주기에 포함될 이전 영역의 점유 임계 값을 설정합니다. 기본 점유율은 65 %입니다.

-XX:G1HeapWastePercent=10

낭비 할 힙의 백분율을 설정합니다. 재 확보 가능 백분율이 힙 낭비 백분율보다 작을 때 Java HotSpot VM은 혼합 가비지 콜렉션주기를 시작하지 않습니다.

-XX:G1MixedGCCountTarget=8

최대 G1MixedGCLIveThresholdPercent 라이브 데이터로 이전 지역을 수집하기 위해 표시주기 후 혼합 가비지 콜렉션의 대상 수를 설정합니다. 기본값은 8 개의 혼합 가비지 콜렉션입니다.

-XX:G1OldCSetRegionThresholdPercent=10

혼합 가비지 콜렉션주기 동안 수집 할 이전 영역 수의 상한을 설정합니다. 기본값은 Java 힙의 10 %입니다.

-XX:G1ReservePercent=10

여유 공간 오버플로의 위험을 줄이기 위해 사용 가능하게 유지할 예약 메모리의 백분율을 설정합니다. 기본값은 10 %입니다. 백분율을 늘리거나 줄일 때 총 Java 힙을 동일한 양으로 조정해야합니다.

위의 문서 페이지를 따를 경우 필요하지 않은 많은 G1GC 매개 변수를 재구성했습니다. 특히 CPU 코어를 기반으로하는 ParallelGCThreadsConcGCThreads 에 대한 위의 권장 사항을 교차 확인하십시오 . 불필요한 매개 변수의 재구성을 제거하십시오.

오라클의 권장 사항 :

G1 GC를 평가하고 미세 조정할 때 다음 권장 사항을 염두에 두십시오.

  1. 젊은 세대 크기 : -Xmn옵션 또는 기타 관련 옵션을 사용하여 명시 적으로 젊은 세대 크기를 설정하지 마십시오 -XX:NewRatio. 젊은 세대의 크기를 수정하면 목표 일시 중지 시간 목표가 무시 됩니다.

  2. 일시 중지 시간 목표 : 가비지 수집을 평가하거나 조정할 때 항상 대기 시간과 처리량 균형이 맞습니다. G1 GC는 균일 한 일시 중지가있는 증분 가비지 수집기이지만 애플리케이션 스레드에서 더 많은 오버 헤드도 발생합니다. G1 GC의 처리량 목표는 애플리케이션 시간 90 %와 가비지 수집 시간 10 % 입니다.

  1. cms 또는 Java 7의 병렬 수집기와 같은 다른 수집기에 변경 사항이 있습니까?

Java 7에는 몇 가지 변경 사항이 있습니다.이 기사를 살펴보십시오.

  1. Java 7의 가비지 컬렉션에 대한 좋은 문서는 어디에서 찾을 수 있습니까?

gc 및 관련 SE 질문 에 대한 Oracle 문서 페이지를 참조하십시오 .

프로덕션에서 Java G1 가비지 수집


3

G1은 jdk 1.7.0_02의 기본 가비지 수집기가 아닙니다. 기본 가비지 수집기는 시스템 클래스에 따라 다릅니다. 시스템이 서버 클래스 인 경우 기본 가비지 수집기는 처리량 수집기입니다. 시스템이 클라이언트 클래스 인 경우 기본 가비지 수집기는 직렬 수집기입니다.


1
나는 이것이 전적으로 옳다고 주장한다 . Java 5 참조 , 여전히 유효합니다. Windows 시스템 (32/64) : 기본적으로 Java 32 비트 (5..8) >> Serial GC를 실행합니다. 기본적으로 Java 64 비트 (5..6) >> ParallelGC (Young gen 전용)를 실행합니다. 기본적으로 Java 64 비트 (7..8) >> ParallelOldGC (병렬 Young 및 Old)를 실행합니다. 자바 7 참조 변화는 , 결국 '평행'집 == "처리량"집 "
루크 Usherwood

3
(이 사람에 대한 가혹한 반응은 처음이고, 정확, SO 기여 나는 그것은 또한 마지막의주의.은.)
누가 복음 Usherwood


0

기본적으로 G1 수집기를 사용하고 싶지는 않습니다. 다른 수집기보다 낫지 않기 때문입니다. 특별한 목적을 위해서만 좋습니다.

짧은 지연 시간에서 응용 프로그램은 CMS보다 약간 더 짧고 예측 가능한 일시 중지 시간이 있기 때문에 조금 더 좋습니다. 대가로 처리량은 CMS보다 훨씬 나쁩니다.

따라서 대기 시간이 중요한 경우에만 좋지만 처리량은 전혀 중요하지 않습니다. 둘 다 중요하다면 CMS를 유지하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.