Java 7 은 한동안 출시 되었지만 가비지 수집기 , 특히 새로운 G1 수집기 의 구성에 대한 좋은 리소스를 찾을 수 없습니다 .
내 질문 :
- G1은 Java 7의 기본 수집기이며 그렇지 않은 경우 어떻게 G1을 활성화합니까?
- Java7에서 g1의 선택적 설정은 무엇입니까?
- cms 또는 Java 7 의 병렬 수집기 와 같은 다른 수집기에 변경 사항이 있습니까?
- Java 7의 가비지 컬렉션에 대한 좋은 문서는 어디에서 찾을 수 있습니까?
답변
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.
좋은 문서를 어디서 찾을 수 있는지 모르겠습니다.
답변
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입니다.
답변
예, 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의 내부를 이해하는 데 매우 도움이됩니다.
답변
1. G1이 Java 7의 기본 수집기입니까? (…)
이 Java 5 페이지 의 규칙 은 Java 7 (및 AFAIK, Java 8)에서 계속 적용됩니다.
일 서버급 병렬 콜렉터 (-XX : + UseParallelGC) 서버 VM을 실행하는 시스템, 가비지 컬렉터 (GC)는 이전의 일련 콜렉터 (+ UseSerialGC – XX)로 변경 하였다.
그러나 다음 사항도 고려하십시오.
- 64 비트 JVM은
-client
VM 과 함께 제공되지 않으므로 항상 “서버 클래스”입니다. - 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.
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
약간의 심층 읽기가 필요하지만 약간의 조정이 필요한 경우 시간을 할애 할 가치가 있습니다. 특히 통찰력있는 것은 가비지 수집기 인체 공학입니다.
답변
- G1은 Java 7의 기본 수집기이며 그렇지 않은 경우 어떻게 G1을 활성화합니까?
G1은 Java 7의 기본 수집기가 아닙니다. -XX:+UseG1GC
G1GC를 활성화합니다.
- 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 코어를 기반으로하는 ParallelGCThreads 및 ConcGCThreads 에 대한 위의 권장 사항을 교차 확인하십시오 . 불필요한 매개 변수의 재구성을 제거하십시오.
오라클의 권장 사항 :
G1 GC를 평가하고 미세 조정할 때 다음 권장 사항을 염두에 두십시오.
-
젊은 세대 크기 :
-Xmn
옵션 또는 기타 관련 옵션을 사용하여 명시 적으로 젊은 세대 크기를 설정하지 마십시오-XX:NewRatio
. 젊은 세대의 크기를 수정하면 목표 일시 중지 시간 목표가 무시 됩니다. -
일시 중지 시간 목표 : 가비지 수집을 평가하거나 조정할 때 항상 대기 시간과 처리량 균형이 맞습니다. G1 GC는 균일 한 일시 중지가있는 증분 가비지 수집기이지만 애플리케이션 스레드에서 더 많은 오버 헤드도 발생합니다. G1 GC의 처리량 목표는 애플리케이션 시간 90 %와 가비지 수집 시간 10 % 입니다.
- cms 또는 Java 7의 병렬 수집기와 같은 다른 수집기에 변경 사항이 있습니까?
Java 7에는 몇 가지 변경 사항이 있습니다.이 기사를 살펴보십시오.
- Java 7의 가비지 컬렉션에 대한 좋은 문서는 어디에서 찾을 수 있습니까?
gc 및 관련 SE 질문 에 대한 Oracle 문서 페이지를 참조하십시오 .
답변
G1은 jdk 1.7.0_02의 기본 가비지 수집기가 아닙니다. 기본 가비지 수집기는 시스템 클래스에 따라 다릅니다. 시스템이 서버 클래스 인 경우 기본 가비지 수집기는 처리량 수집기입니다. 시스템이 클라이언트 클래스 인 경우 기본 가비지 수집기는 직렬 수집기입니다.
답변
http://www.oracle.com/technetwork/java/javase/tech/g1-intro-jsp-135488.html(Wojtek 에서 제공하는 링크)에 있는 문서 는 정보가있는 유일한 공식 링크 인 것 같지만 정보는 언급 된 플래그 중 일부는 테스트 빌드에서만 사용할 수 있었으며 더 이상 프로덕션 릴리스에는 존재하지 않기 때문에 구식으로 보입니다. Oracle의 일부는 G1 GC에 대한 업데이트 된 문서를 제공해야합니다.