เกินขีด จำกัด ค่าโสหุ้ย GC


93

เวลาสุ่มตัวอย่างที่ JVM ใช้ในการโยน 'java.lang.OutOfMemoryError: GC เกินขีด จำกัด ค่าโสหุ้ย' คืออะไร ฉันรู้ว่าคุณสามารถควบคุม 98% และ 2% ด้วยพารามิเตอร์ GCTimeLimit และ GCHeapFreeLimit แต่เวลาสุ่มตัวอย่างเป็นอย่างไร

คำตอบ:


82

จากJava SE 6 HotSpot [tm] Virtual Machine Garbage Collection Tuning

ดังต่อไปนี้

เวลา GC มากเกินไปและ OutOfMemoryError

ตัวรวบรวมพร้อมกันจะโยน OutOfMemoryError หากใช้เวลามากเกินไปในการรวบรวมขยะ: ถ้ามากกว่า 98% ของเวลาทั้งหมดที่ใช้ไปในการรวบรวมขยะและมีการกู้คืนฮีปน้อยกว่า 2% ระบบจะโยน OutOfMemoryError คุณลักษณะนี้ออกแบบมาเพื่อป้องกันไม่ให้แอปพลิเคชันทำงานเป็นระยะเวลานานในขณะที่มีความคืบหน้าเพียงเล็กน้อยหรือไม่มีเลยเนื่องจากฮีปมีขนาดเล็กเกินไป หากจำเป็นคุณสมบัตินี้สามารถปิดใช้งานได้โดยเพิ่มอ็อพชัน -XX: -UseGCOverheadLimit ในบรรทัดรับคำสั่ง

นโยบายนี้เหมือนกับในตัวรวบรวมคู่ขนานยกเว้นว่าเวลาที่ใช้ในการดำเนินการรวบรวมพร้อมกันจะไม่นับรวมในเวลาที่ จำกัด 98% กล่าวอีกนัยหนึ่งเฉพาะการรวบรวมที่ดำเนินการในขณะที่แอปพลิเคชันหยุดนับเป็นเวลา GC ที่มากเกินไป คอลเลกชันดังกล่าวมักเกิดจากความล้มเหลวของโหมดพร้อมกันหรือการร้องขอการรวบรวมอย่างชัดเจน (เช่นการโทรไปที่ System.gc ())

ร่วมกับข้อความที่อยู่ไกลออกไป

หนึ่งในการใช้การรวบรวมขยะอย่างชัดเจนที่พบบ่อยที่สุดเกิดขึ้นกับ RMIs แบบกระจายการรวบรวมขยะ (DGC) แอปพลิเคชันที่ใช้ RMI อ้างถึงอ็อบเจ็กต์ในเครื่องเสมือนอื่น ๆ ไม่สามารถรวบรวมขยะในแอปพลิเคชันแบบกระจายเหล่านี้โดยไม่ได้รวบรวมฮีปภายในเป็นครั้งคราวดังนั้น RMI จึงบังคับให้มีการรวบรวมทั้งหมดเป็นระยะ ความถี่ของคอลเลกชันเหล่านี้สามารถควบคุมได้ด้วยคุณสมบัติ ตัวอย่างเช่น,

java -Dsun.rmi.dgc.client.gcInterval=3600000

-Dsun.rmi.dgc.server.gcInterval=3600000 ระบุการรวบรวมอย่างชัดเจนหนึ่งครั้งต่อชั่วโมงแทนที่จะเป็นอัตราเริ่มต้นหนึ่งครั้งต่อนาที อย่างไรก็ตามสิ่งนี้อาจทำให้วัตถุบางชิ้นใช้เวลานานกว่ามากในการเรียกคืน คุณสมบัติเหล่านี้สามารถตั้งค่าได้สูงถึง Long.MAX_VALUE เพื่อให้เวลาระหว่างคอลเลกชันที่ชัดเจนไม่มีที่สิ้นสุดอย่างมีประสิทธิภาพหากไม่มีความปรารถนาที่จะกำหนดขอบเขตสูงสุดเกี่ยวกับเวลาของกิจกรรม DGC

ดูเหมือนจะบอกเป็นนัยว่าระยะเวลาการประเมินผลสำหรับการกำหนด 98% นั้นยาวหนึ่งนาที แต่อาจกำหนดค่าได้ใน JVM ของ Sun ด้วยการกำหนดที่ถูกต้อง

แน่นอนว่าการตีความเป็นไปได้อื่น ๆ


5
RMI กระจายการรวบรวมขยะเป็นกิจกรรมที่ไม่เกี่ยวข้องกับการเก็บขยะตามปกติ ดังนั้นฉันไม่เห็นว่าคุณจะสรุปได้อย่างไรว่าคุณเพิ่งทำไป
Stephen C

2
การอนุมานไม่สมบูรณ์แบบหรือถูกต้องด้วยเหตุนี้จึงใช้ "ดูเหมือนจะบอกเป็นนัย" แทน "นัย" หากคุณเห็นด้วยกับข้อสังเกตที่ว่าหากผู้คนใน Sun ใช้เวลาหนึ่งนาทีในการกำหนดช่วงเวลาการรวบรวมขยะสำหรับ RMI เวลาเก็บรวบรวมในการรวบรวมพร้อมกันจะคำนวณเฉพาะเมื่อโปรแกรมหลักหยุดลงและสร้างความเชื่อที่ก้าวกระโดดขึ้นเล็กน้อย จากนั้นอัตราต่อรองจะดี 98% จะถูกรวบรวมในหนึ่งนาที มันเป็นเลขวิเศษ แต่หนึ่งนาทีเป็นเลขวิเศษที่มักใช้เปรียบเทียบกับพูด 3.5 นาที
Edwin Buck

@StephenC คุณหมายถึงแม้ว่าเราจะตั้งค่า-XX:+DisableExplicitGC มันจะไม่ส่งผลกระทบต่อการกำหนดค่าที่เกี่ยวข้องกับ RMI และระบบจะเรียกใช้ gc ในความถี่ที่กำหนดด้วยพารามิเตอร์-Dsun.rmi.dgc.server.gcInterval
Steephen

1
@ สตีเฟ่น - ไม่นั่นไม่ใช่สิ่งที่ฉันพูด ผมกำลังพูดถึงคำสั่งนี้: "ดูเหมือนจะบ่งบอกว่าระยะเวลาการประเมินสำหรับการกำหนด 98% เป็นหนึ่งนาทีที่ยาวนาน ..." และโปรดทราบว่า Edwin ยอมรับว่าการอนุมานนั้น "ไม่สมบูรณ์" การอนุมานตั้งอยู่บนสมมติฐานที่ว่าชาวดวงอาทิตย์ที่ใช้ RMI (& DGC) อยู่ในการสื่อสารอย่างใกล้ชิดกับคนที่ใช้กลไกการ จำกัด ค่าโสหุ้ย GC ฉันสงสัยว่าการพัฒนาทั้งสองเกิดขึ้นจริงในช่วงเวลาที่ต่างกัน โปรดทราบว่า-Dsun.rmi.dgc.server.gcIntervalคุณสมบัตินี้มีมาตั้งแต่ Java 1.2
Stephen C

1
อย่างไรก็ตามวิธีที่ดีกว่าในการค้นหาคำตอบที่แท้จริงสำหรับคำถามนี้คือการดูซอร์สโค้ด OpenJDK
Stephen C
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.