(สำหรับGo 1.8 - Q1 2017 ดูด้านล่าง )
เครื่องเก็บขยะGo 1.5 พร้อมกันครั้งต่อไปเกี่ยวข้องกับความสามารถในการ "ก้าว" กล่าวว่า gc
นี่คือข้อเสนอที่นำเสนอในเอกสารนี้ซึ่งอาจใช้สำหรับ Go 1.5 แต่ยังช่วยให้เข้าใจ gc ใน Go
คุณสามารถเห็นสถานะก่อน 1.5 (Stop The World: STW)
ก่อนหน้า Go 1.5 Go ได้ใช้ตัวสะสมstop-the-world (STW) แบบขนาน
แม้ว่าคอลเลกชัน STW จะมีข้อเสียมากมาย แต่อย่างน้อยก็มีพฤติกรรมการเติบโตของฮีปที่คาดเดาได้และควบคุมได้
(ภาพจากงานนำเสนอGopherCon 2015 " Go GC: Solving the Latency Problem in Go 1.5 ")
ลูกบิดปรับแต่ง แต่เพียงผู้เดียวสำหรับคอลเลกชัน STW คือ“ GOGC” การเติบโตของฮีปที่สัมพันธ์กันระหว่างคอลเลกชัน การตั้งค่าเริ่มต้น 100% เรียกใช้การรวบรวมขยะทุกครั้งที่ขนาดฮีปเพิ่มขึ้นเป็นสองเท่าของขนาดฮีปที่ใช้งานจริงเมื่อเทียบกับคอลเล็กชันก่อนหน้านี้:
เวลา GC ในตัวรวบรวม STW
ไป 1.5 แนะนำสะสมพร้อมกัน
สิ่งนี้มีข้อดีมากกว่าการรวบรวม STW แต่มันทำให้การเติบโตของฮีปควบคุมได้ยากขึ้นเนื่องจากแอปพลิเคชันสามารถจัดสรรหน่วยความจำในขณะที่ตัวรวบรวมขยะกำลังทำงานอยู่
(ภาพจากงานนำเสนอGopherCon 2015 " Go GC: Solving the Latency Problem in Go 1.5 ")
เพื่อให้บรรลุขีด จำกัด การเติบโตของฮีปเดียวกันรันไทม์ต้องเริ่มการรวบรวมขยะก่อนหน้านี้ แต่จะเร็วแค่ไหนขึ้นอยู่กับตัวแปรหลายตัวซึ่งหลายตัวแปรไม่สามารถคาดเดาได้
- เริ่มตัวรวบรวมเร็วเกินไปและแอปพลิเคชันจะดำเนินการรวบรวมขยะมากเกินไปทำให้สิ้นเปลืองทรัพยากร CPU
- เริ่มตัวรวบรวมช้าเกินไปและแอปพลิเคชันจะเกินการเติบโตของฮีพสูงสุดที่ต้องการ
การบรรลุความสมดุลที่เหมาะสมโดยไม่ต้องเสียสละการทำงานพร้อมกันจำเป็นต้องมีการเว้นจังหวะอย่างระมัดระวัง
GC pacing มีจุดมุ่งหมายเพื่อเพิ่มประสิทธิภาพตามสองมิติ ได้แก่ การเติบโตของฮีปและ CPU ที่ใช้โดยตัวรวบรวมขยะ
การออกแบบการเว้นวรรค GC ประกอบด้วยสี่องค์ประกอบ:
- ตัวประมาณจำนวนงานสแกนที่วงจร GC จะต้องใช้
- กลไกสำหรับ mutators เพื่อดำเนินการสแกนจำนวนโดยประมาณตามเวลาที่การจัดสรรฮีปถึงเป้าหมายฮีป
- ตัวกำหนดตารางเวลาสำหรับการสแกนเบื้องหลังเมื่อ mutator ช่วยลดงบประมาณของ CPU และ
- ตัวควบคุมตามสัดส่วนสำหรับทริกเกอร์ GC
การออกแบบที่สมดุลสองมุมมองที่แตกต่างกันของเวลา: เวลา CPU และเวลาที่กอง
- เวลาของ CPUก็เหมือนกับเวลานาฬิกาแขวนมาตรฐาน แต่จะผ่านไป
GOMAXPROCS
เร็วกว่า
นั่นคือถ้าGOMAXPROCS
เป็น 8 วินาที CPU แปดวินาทีจะผ่านทุก ๆ กำแพงวินาทีและ GC จะได้รับเวลา CPU สองวินาทีทุก ๆ วินาที
ตัวกำหนดตารางเวลา CPU จัดการเวลาของ CPU
- เวลาที่ผ่านไปของฮีปจะถูกวัดเป็นไบต์และเดินหน้าต่อไปเมื่อมิวเตเตอร์จัดสรร
ความสัมพันธ์ระหว่างเวลาฮีปและเวลาผนังขึ้นอยู่กับอัตราการจัดสรรและสามารถเปลี่ยนแปลงได้ตลอดเวลา
Mutator ช่วยจัดการเวลาที่ผ่านไปของฮีปทำให้มั่นใจได้ว่างานสแกนโดยประมาณจะเสร็จสมบูรณ์เมื่อฮีปถึงขนาดเป้าหมาย
ในที่สุดตัวควบคุมทริกเกอร์จะสร้างลูปข้อเสนอแนะที่เชื่อมโยงมุมมองเวลาทั้งสองนี้เข้าด้วยกันโดยเพิ่มประสิทธิภาพสำหรับทั้งเวลาฮีปและเป้าหมายเวลาของ CPU