Java GC (การจัดสรรล้มเหลว)


129

ทำไม "GC (การจัดสรรล้มเหลว)" เสมอ

เซิร์ฟเวอร์ Java HotSpot (TM) 64- บิต VM (25.25-b02) สำหรับ linux-amd64 JRE ( 1.8.0_25 -b17),

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 ที่จะเตะ

"ความล้มเหลวในการจัดสรร" หมายความว่าไม่มีพื้นที่เหลือในอีเด็นในการจัดสรรวัตถุ มันเป็นสาเหตุปกติของ GC หนุ่ม

JVM ที่เก่ากว่าไม่พิมพ์สาเหตุ GC สำหรับรอบ GC รอง

"การจัดสรรล้มเหลว" เป็นสาเหตุที่เป็นไปได้สำหรับ GC เล็กน้อย อีกเหตุผลที่ GC รองเตะอาจเป็นช่วงหมายเหตุ CMS (ถ้า+XX:+ScavengeBeforeRemarkเปิดใช้งาน)


1
ขอบคุณ เพิ่งพบว่า JVM เก่าไม่พิมพ์ Allocation Failure
user3644708

2
ฉันไม่ได้รับคำตอบนี้อย่างเต็มที่ดังนั้นควรหลีกเลี่ยงหรือไม่? "มันเป็นสาเหตุปกติของ GC หนุ่ม" GC รุ่นเยาว์เป็นทางเลือกที่ผิดหรือเปล่า?
โทมัส

7
ใช่นี่เป็นพฤติกรรมปกติ
Alexey Ragozin

183
GC (การจัดสรรล้มเหลว) เป็นตัวเลือกคำที่ไม่ดีสำหรับเหตุการณ์ที่จะเกิดขึ้นตามปกติหลายครั้งต่อวัน วิศวกร JVM เหล่านั้นควรออกไปบ่อยขึ้นและพยายามเข้าสังคมในโลกแห่งความเป็นจริงเพื่อให้พวกเขาสามารถเรียนรู้คำศัพท์ที่เป็นมิตรมากขึ้นที่ผู้คนเข้าใจ
Salvador Valencia Valencia

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) ทั้งหมด" - ใน java 1.8 โหมดเซิร์ฟเวอร์ฉันทำซ้ำหยุดชั่วคราวสั้น ๆ และร่องรอยทั้งสองนี้ถูกพิมพ์ด้วยกัน: [GC (Allocation Failure) 2287742K-> 1148645K (2633216K), 0.4571912 วินาที] [Full GC (Ergonomics) 1148645K-> 1112141K (3184128K), 2.8563984 วินาที] ดังนั้นฉันจึงยกเลิกคำตอบของคุณ ;-)
Jose Manuel Gomez Alvarez

-10

เมื่อใช้ CMS GC ใน jdk1.8 จะตรวจสอบข้อผิดพลาดนี้ฉันเปลี่ยน 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 และตอนนี้คุณไม่มีข้อความเช่นนั้น?
Simplylizz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.