Java GC (할당 실패)


129

왜 항상 "GC (할당 실패)"?

linux-amd64 JRE ( 1.8.0_25 -b17) 용 Java HotSpot ™ 64 비트 서버 VM (25.25-b02 ),

CommandLine flags: 
-XX:CMSInitiatingOccupancyFraction=60 
-XX:GCLogFileSize=10485760 
-XX:+HeapDumpOnOutOfMemoryError 
-XX:InitialHeapSize=32212254720 
-XX:MaxHeapSize=32212254720 
-XX:NewRatio=10 
-XX:OldPLABSize=16 
-XX:ParallelGCThreads=4 
-XX:+PrintGC 
-XX:+PrintGCDetails 
-XX:+PrintGCTimeStamps 
-XX:+PrintStringTableStatistics 
-XX:+PrintTenuringDistribution 
-XX:StringTableSize=1000003 
-XX:SurvivorRatio=4 
-XX:TargetSurvivorRatio=50 
-XX:+UseCompressedClassPointers 
-XX:+UseCompressedOops
-XX:+UseParNewGC 
-XX:+UseConcMarkSweepGC
27.329: [GC (Allocation Failure) 27.329: [ParNew
Desired survivor size 44728320 bytes, new threshold 15 (max 15)
- age   1:   16885304 bytes,   16885304 total
: 349568K->16618K(436928K), 0.2069129 secs] 349568K->16618K(31369920K), 0.2070712 secs] [Times: user=0.78 sys=0.04, real=0.21 secs]


28.210: [GC (Allocation Failure) 28.210: [ParNew
Desired survivor size 44728320 bytes, new threshold 15 (max 15)
- age   1:   28866504 bytes,   28866504 total
- age   2:   12582536 bytes,   41449040 total
: 366186K->47987K(436928K), 0.2144807 secs] 366186K->47987K(31369920K), 0.2146024 secs] [Times: user=0.84 sys=0.01, real=0.22 secs]


29.037: [GC (Allocation Failure) 29.038: [ParNew
Desired survivor size 44728320 bytes, new threshold 2 (max 15)
- age   1:   28443488 bytes,   28443488 total
- age   2:   28386624 bytes,   56830112 total
- age   3:   12579928 bytes,   69410040 total
: 397555K->76018K(436928K), 0.2357352 secs] 397555K->76018K(31369920K), 0.2358535 secs] [Times: user=0.93 sys=0.01, real=0.23 secs]

답변:


203

"할당 실패"는 GC주기가 시작되는 원인입니다.

"할당 실패"는 Eden에 더 이상 개체를 할당 할 공간이 남아 있지 않음을 의미합니다. 따라서 젊은 GC의 정상적인 원인입니다.

이전 JVM은 사소한 GC주기에 대한 GC 원인을 인쇄하지 않았습니다.

"할당 실패"는 사소한 GC의 가능한 원인 일뿐입니다. 사소한 GC가 시작되는 또 다른 이유는 CMS 발언 단계 ( +XX:+ScavengeBeforeRemark활성화 된 경우 ) 일 수 있습니다.


1
감사. 이전 JVM이 할당 실패를 인쇄하지 않는 것을 찾으십시오.
user3644708

2
이 답변을 완전히 얻지 못하므로 피해야합니까? "젊은 GC의 정상적인 원인"입니다. 어린 GC가 잘못된 선택입니까?
Thomas

7
그렇습니다, 이것은 정상적인 행동입니다
Alexey Ragozin

183
GC (할당 실패)는 하루에 여러 번 일반적으로 발생하는 이벤트에 대해 단어를 잘못 선택하는 것입니다. 이러한 JVM 엔지니어는 사람들이 이해하는보다 친숙한 용어를 배울 수 있도록 더 자주 나가서 현실 세계에서 사교를 시도해야합니다.
살바도르 발렌시아

80
@SalvadorValencia GC 로그를 정기적으로 읽는 사람들도 정확히 "정상적인"것은 아닙니다. :)
biziclop

8

"할당 실패"는 GC가 발차하는 원인이 아닙니다. GC 운영의 결과입니다.

할당 할 공간이 없으면 GC가 시작됩니다 (지역에 따라 부 또는 주요 GC가 수행됨). 공간이 충분히 확보되면 GC가 수행되지만 충분한 크기가 없으면 실패합니다. 할당 실패는 그러한 실패 중 하나입니다. 아래 문서에 좋은 설명이 있습니다 https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc.html


1
"(...) 그러면 할당 실패가 발생하고 (피난되는 영역에서 라이브 오브젝트를 할당 할 공간이 없기 때문에) STW (stop-the-world) 전체 수집이 완료됩니다." -자바 1.8, 서버 모드에서 나는 잠깐 멈추었다가 두 트레이스가 함께 인쇄되었다 : [GC (Allocation Failure) 2287742K-> 1148645K (2633216K), 0.4571912 secs] [Full GC (Ergonomics) 1148645K-> 1112141K (3184128K), 2.8563984 초]. 나는 당신의 대답 ;-) upvote에 그래서
호세 마누엘 고메즈 알바레즈

-10

jdk1.8에서 CMS GC를 사용하면이 오류가 표시되면 G1 Gc를 변경하면이 문제가 해결됩니다.

 -Xss512k -Xms6g -Xmx6g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=70 -XX:NewRatio=1 -XX:SurvivorRatio=6 -XX:G1ReservePercent=10 -XX:G1HeapRegionSize=32m -XX:ConcGCThreads=6 -Xloggc:gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 

1
왜 이렇게 많은 표가 내려 졌습니까? 설명이 도움이 될 것입니다.
Mike Stoddart

2
그것은 당신이 Rust에서 프로그램을 다시 작성했다고 말하고 지금은 그런 메시지가 없습니까?
단순히
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.