เวลาสุ่มตัวอย่างที่ JVM ใช้ในการโยน 'java.lang.OutOfMemoryError: GC เกินขีด จำกัด ค่าโสหุ้ย' คืออะไร ฉันรู้ว่าคุณสามารถควบคุม 98% และ 2% ด้วยพารามิเตอร์ GCTimeLimit และ GCHeapFreeLimit แต่เวลาสุ่มตัวอย่างเป็นอย่างไร
เวลาสุ่มตัวอย่างที่ JVM ใช้ในการโยน 'java.lang.OutOfMemoryError: GC เกินขีด จำกัด ค่าโสหุ้ย' คืออะไร ฉันรู้ว่าคุณสามารถควบคุม 98% และ 2% ด้วยพารามิเตอร์ GCTimeLimit และ GCHeapFreeLimit แต่เวลาสุ่มตัวอย่างเป็นอย่างไร
คำตอบ:
จาก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 ด้วยการกำหนดที่ถูกต้อง
แน่นอนว่าการตีความเป็นไปได้อื่น ๆ
-XX:+DisableExplicitGC
มันจะไม่ส่งผลกระทบต่อการกำหนดค่าที่เกี่ยวข้องกับ RMI และระบบจะเรียกใช้ gc ในความถี่ที่กำหนดด้วยพารามิเตอร์-Dsun.rmi.dgc.server.gcInterval
-Dsun.rmi.dgc.server.gcInterval
คุณสมบัตินี้มีมาตั้งแต่ Java 1.2