นักสะสมขยะ Java คืออะไร
Java Garbage Collector เป็นหนึ่งในสามโมดูลสำคัญของ Java Virtual Machine (JVM) (อีกสองโมดูลเป็นล่ามและกลไกหลายเธรด) มันมีแอพพลิเคชั่นที่มีการจัดสรรหน่วยความจำอัตโนมัติ (การจัดสรรหน่วยความจำ) และฟังก์ชั่นการรวบรวมหน่วยความจำอัตโนมัติ (รวบรวมขยะ) การดำเนินการทั้งสองเกิดขึ้นบนกอง Java (ชิ้นส่วนของหน่วยความจำเร็ว) ณ จุดหนึ่งหากวัตถุมีการอ้างอิงมากกว่าหนึ่งตัวชี้ไปที่มันวัตถุจะมีชีวิตอยู่ มิฉะนั้นจะได้รับการพิจารณาว่าเป็นขยะและสามารถนำกลับมาใช้ใหม่และนำกลับมาใช้ใหม่โดยนักสะสมขยะ การดำเนินการรวบรวมขยะต้องใช้ CPU, เธรด, เวลาและทรัพยากรอื่น ๆ ดังนั้นจึงเป็นเรื่องง่ายที่จะเข้าใจว่าการดำเนินการเก็บขยะไม่ได้เกิดขึ้นแบบเรียลไทม์ (วัตถุจะถูกปล่อยออกมาทันทีหลังจากความตาย) เมื่อมีการใช้หน่วยความจำหรือถึงตัวบ่งชี้บางอย่าง (เกณฑ์อัตราส่วนของหน่วยความจำต่อหน่วยความจำทั้งหมดจะถูกใช้เช่น 0.75) การดำเนินการรวบรวมขยะจะถูกกระตุ้น มีข้อยกเว้นสำหรับการตายของวัตถุ แม้ว่าวัตถุประเภท java.lang จะไม่ถูกอ้างอิงตราบใดที่เธรดยังคงทำงานอยู่มันจะไม่ถูกรีไซเคิล
กลไกการรีไซเคิล
จากการวิเคราะห์ทางสถิติวัตถุส่วนใหญ่ใน Java (รวมถึงภาษาระดับสูงอื่น ๆ ) มีวัฏจักรชีวิตระยะสั้นดังนั้นหน่วยความจำ Java จึงได้รับการจัดการในรุ่น วัตถุประสงค์ของการแบ่งรุ่นไม่มีอะไรมากไปกว่าการใช้กลยุทธ์การจัดการที่แตกต่างกัน (อัลกอริทึม) สำหรับบล็อกหน่วยความจำของรุ่นที่แตกต่างกันเพื่อเพิ่มประสิทธิภาพสูงสุด เมื่อเทียบกับคนรุ่นเก่าคนรุ่นใหม่มักจะเล็กกว่ามากและความถี่ในการรีไซเคิลนั้นสูงและความเร็วเร็ว ผู้สูงอายุมีความถี่ในการรีไซเคิลต่ำและใช้เวลานาน หน่วยความจำมีการแจกจ่ายในคนรุ่นใหม่ วัตถุในรุ่นเยาวชนจะได้รับการเลื่อนตำแหน่งให้เป็นรุ่นเก่าโดยอัตโนมัติหลังจากการรีไซเคิลหลายรอบ
ตัวเลือกการออกแบบ
การเลือกการออกแบบมีผลต่อความยากลำบากในการใช้งานของ JVM Garbage Collector และตัวบ่งชี้ประสิทธิภาพ JVM และเหมาะสำหรับสถานการณ์ที่แตกต่างกัน มันอธิบายถึงลักษณะสไตล์ของอัลกอริทึมการรีไซเคิล
การรีไซเคิลอนุกรมแบบเธรดเดี่ยวกับการรีไซเคิลแบบมัลติเธรดแบบหลายเธรด
คำถามที่ว่าการดำเนินการรีไซเคิลนั้นถูกประมวลผลโดยหลายเธรดหรือไม่ ข้อดีของการรีไซเคิลแบบเธรดเดี่ยวคือมันง่ายใช้งานง่ายมีชิ้นส่วนน้อยและเหมาะสำหรับเครื่องจักรเดียว การรีไซเคิลแบบมัลติเธรดแบบขนานสามารถใช้ทรัพยากร CPU อย่างเต็มที่ในเครื่องหลายคอร์ลดเวลาในการรีไซเคิลและเพิ่มผลผลิต ข้อเสียคือมันซับซ้อนและบางส่วนอาจไม่ได้รีไซเคิล
PAUSE Application Thread ระหว่างการรีไซเคิลกับการรีไซเคิลและแอปพลิเคชันพร้อมกัน
ออกว่าจะหยุดเธรดแอปพลิเคชันชั่วคราวในระหว่างการดำเนินการรีไซเคิลหรือไม่ ข้อดีของหัวข้อแอปพลิเคชันหยุดชั่วคราวคือมันง่ายแม่นยำทำความสะอาดค่อนข้างสะอาดและทำความสะอาดในช่วงเวลาสั้น ๆ (ไม่รวมทรัพยากร CPU) ข้อเสียคือการหยุดเธรดแอปพลิเคชันจะทำให้เวลาตอบสนองแอปพลิเคชันขยายเวลาในระหว่างรอบการรวบรวมขยะและระบบที่มีประสิทธิภาพแบบเรียลไทม์สูงมากมีความอ่อนไหวมากขึ้น ข้อดีของการประมวลผลแบบขนานของการรีไซเคิลและเธรดแอปพลิเคชันคือเวลาตอบสนองของแอปพลิเคชันค่อนข้างเสถียรและข้อเสียคือมันยากที่จะบรรลุความถี่ทำความสะอาดสูงและการกระจายตัวที่เป็นไปได้
UNMERGE Freed Memory Fragments เทียบกับ Merge Memory Memory Fragments เทียบกับการคัดลอก Alive ไปยังสถานที่ใหม่
ตัวเลือกทั้งสามนี้อธิบายถึงวิธีจัดการชิ้นส่วนบล็อกหน่วยความจำที่ตายแล้ว ชิ้นส่วนหน่วยความจำที่ตายแล้วมักจะกระจัดกระจายไปทุกที่ในกอง หากพวกเขาไม่ได้จัดการจะมีสองปัญหา เมื่อการจัดสรรหน่วยความจำช้าเนื่องจากการค้นหาหน่วยความจำที่มีอยู่ชิ้นส่วนเล็ก ๆ จะนำไปสู่การเสียหน่วยความจำ (เช่นอาร์เรย์ขนาดใหญ่ต้องการชิ้นส่วนหน่วยความจำต่อเนื่องขนาดใหญ่) มีสองวิธีในการจัดการ: ย้ายหน่วยความจำที่มีชีวิตไปที่ปลายด้านหนึ่งของบล็อกหน่วยความจำบันทึกตำแหน่งเริ่มต้นของหน่วยความจำที่มีอยู่หรือเพียงแค่คัดลอกหน่วยความจำที่มีชีวิตไปยังพื้นที่หน่วยความจำใหม่และบล็อกหน่วยความจำดั้งเดิมว่างเปล่าอย่างสมบูรณ์
ตัวชี้วัดประสิทธิภาพ
①. ผลผลิต (ปริมาณงาน)
อัตราส่วนของเวลาที่ไม่กู้คืนต่อเวลาทั้งหมดภายในระยะเวลานานขึ้น (มีความหมายเป็นระยะเวลานานเท่านั้น) การวัดประสิทธิภาพการทำงานของระบบ
②. คอลเลกชันขยะค่าใช้จ่าย
อัตราส่วนของเวลาการกู้คืนต่อเวลาทั้งหมดในระยะเวลานานขึ้น สอดคล้องกับผลผลิตผลรวมทั้งหมด 100%
③. หยุดชั่วคราว
เมื่อ Java Virtual Machines รีไซเคิลขยะอัลกอริทึมบางอย่างจะหยุดการดำเนินการของแอปพลิเคชันทั้งหมดชั่วคราวและบางระบบอาจไวต่อช่วงเวลาหยุดชั่วคราว
④. ความถี่ในการรวบรวม
การกู้คืนใช้เวลานานแค่ไหน?
⑤. ขนาดของการใช้หน่วยความจำ (รอยเท้า)
เช่นขนาดของกอง
⑥. เรียลไทม์ (ความรวดเร็ว)
วัตถุใช้เวลานานแค่ไหนในการครอบครองหน่วยความจำจากวัตถุที่จะรีไซเคิล?
ประเภทของการรวบรวมขยะ
ผู้รีไซเคิลทุกประเภทขึ้นอยู่กับเทคโนโลยีทั่วไป เครื่องเสมือน Java Hotspot รวมถึงสามชั่วอายุคนรุ่นใหม่รุ่นเก่าและรุ่นถาวร
①การสร้างที่สมบูรณ์แบบ
จัดเก็บคลาสวิธีการและข้อมูลคำอธิบายของพวกเขา ขนาดเริ่มต้นและค่าสูงสุดสามารถระบุได้โดยสองตัวเลือกทางเลือก -xx: permsize = 64m และ -xx: maxpermsize = 128m โดยปกติแล้วเราไม่จำเป็นต้องปรับพารามิเตอร์นี้ขนาดการสร้างถาวรเริ่มต้นจะเพียงพอ แต่ถ้ามีคลาสที่โหลดมากเกินไปและไม่เพียงพอให้ปรับค่าสูงสุด
②รุ่นเก่า
วัตถุจัดเก็บข้อมูลหลักในรุ่นเยาวชนที่ยังคงอยู่รอดและอัพเกรดหลังจากรอบการรีไซเคิลหลายรอบยังมีชีวิตอยู่ แน่นอนสำหรับการจัดสรรหน่วยความจำขนาดใหญ่บางอย่างพวกเขาอาจได้รับการจัดสรรโดยตรงให้กับรุ่นถาวร (ตัวอย่างที่รุนแรงคือคนรุ่นใหม่ไม่สามารถประหยัดได้เลย)
③รุ่นที่ยอง
การจัดสรรหน่วยความจำส่วนใหญ่และการดำเนินการรีไซเคิลเกิดขึ้นในรุ่นน้อง ดังที่แสดงในรูปด้านล่างคนรุ่นใหม่แบ่งออกเป็นสามพื้นที่พื้นที่เดิม (Eden) และพื้นที่รอดชีวิตขนาดเล็กสองแห่ง (ผู้รอดชีวิต) พื้นที่การอยู่รอดทั้งสองแบ่งออกเป็นจากและตามหน้าที่ของพวกเขา วัตถุส่วนใหญ่ได้รับการจัดสรรในพื้นที่ดั้งเดิมและการดำเนินการเก็บขยะมากกว่าหนึ่งรายการยังคงมีชีวิตอยู่ในพื้นที่นั่งเล่น
นักสะสมอนุกรม
เธรดเดียวดำเนินการรีไซเคิลระงับการดำเนินการของเธรดแอปพลิเคชันทั้งหมดในช่วงระยะเวลาการรีไซเคิล Recycler เริ่มต้นในโหมดไคลเอนต์ถูกบังคับให้ระบุผ่านตัวเลือกบรรทัดคำสั่ง -xx:+eserialgc
collection Minor Collection สำหรับรุ่นเยาว์
ย้ายวัตถุที่รอดชีวิตในพื้นที่อีเด็นไปยังพื้นที่ หากไม่สามารถติดตั้งพื้นที่ไปยังคนรุ่นเก่าได้โดยตรง หากไม่สามารถติดตั้งพื้นที่จากพื้นที่ให้ย้ายไปยังรุ่นเก่าโดยตรง หากพื้นที่จากนั้นเก่ามากให้อัพเกรดเป็นคนรุ่นเก่า หลังจากการรีไซเคิลเสร็จสิ้นทั้งอีเดนและพื้นที่ว่างเปล่า ในเวลานี้ฟังก์ชั่นของจากและไปยังมีการแลกเปลี่ยนจากจะถูกเปลี่ยนเป็นและเป็นและจะว่างเปล่าก่อนการรีไซเคิลรอบแต่ละรอบ การเลือกการออกแบบคือการจำลองแบบ
②อัลกอริทึมการรีไซเคิลสำหรับผู้สูงอายุ (คอลเลกชันเต็ม)
การรีไซเคิลของผู้สูงอายุแบ่งออกเป็นสามขั้นตอน: มาร์คกวาดและผสาน เวทีการทำเครื่องหมายเป็นเครื่องหมายของวัตถุที่รอดชีวิตทั้งหมดเวทีการล้างจะปล่อยวัตถุที่ตายแล้วทั้งหมดและเวทีการรวมกันรวมวัตถุที่รอดชีวิตทั้งหมดเข้ามาในส่วนก่อนหน้าของรุ่นเก่าทิ้งชิ้นส่วนฟรีทั้งหมดไว้ข้างหลัง การเลือกการออกแบบนั้นรวมกันเพื่อลดการกระจายตัวของหน่วยความจำ
นักสะสมคู่ขนาน
ใช้หลายเธรดเพื่อทำการรวบรวมขยะในเวลาเดียวกัน สภาพแวดล้อมแบบมัลติคอร์สามารถใช้ทรัพยากร CPU ได้อย่างเต็มที่ลดเวลาในการรีไซเคิลเพิ่มประสิทธิภาพการทำงานของ JVM และผู้รีไซเคิลเริ่มต้นในโหมดเซิร์ฟเวอร์ เช่นเดียวกับผู้รีไซเคิลอนุกรมการดำเนินการของเธรดแอปพลิเคชันทั้งหมดจะถูกระงับในระหว่างการรีไซเคิล ถูกบังคับให้ระบุผ่านตัวเลือกบรรทัดคำสั่ง -xx:+USEPRALLELGC
collection Minor Collection สำหรับรุ่นเยาว์
หลายเธรดใช้ในการรีไซเคิลขยะและอัลกอริทึมของแต่ละเธรดนั้นเหมือนกับของรีไซเคิลอนุกรม
②อัลกอริทึมการรีไซเคิลสำหรับผู้สูงอายุ (คอลเลกชันเต็ม)
คนรุ่นเก่ายังคงเป็นเธรดเดี่ยวเหมือนกับรีไซเคิลอนุกรม
คอลเลกชันการบีบอัดแบบขนาน
การรีไซเคิลของคนรุ่นใหม่และรุ่นเก่านั้นถูกประมวลผลโดยมัลติเธรด ระบุโดยตัวเลือกคำสั่ง -xx:+USEPRALLELLOLDGC, XX: ParallelGcThreads = 3 สามารถระบุจำนวนเธรดที่เข้าร่วมในการรีไซเคิลแบบขนาน เช่นเดียวกับผู้รีไซเคิลอนุกรมการดำเนินการของเธรดแอปพลิเคชันทั้งหมดจะถูกระงับในระหว่างการรีไซเคิล เมื่อเปรียบเทียบกับรีไซเคิลแบบขนานรุ่นเก่ามีเวลารีไซเคิลที่สั้นกว่าซึ่งจะช่วยลดเวลาหยุดชั่วคราว ถูกบังคับให้ระบุตัวเลือกบรรทัดคำสั่ง XX:+USEPRALLELLOLDGC
collection Minor Collection สำหรับรุ่นเยาว์
เช่นเดียวกับนักสะสมคู่ขนาน
②อัลกอริทึมการรีไซเคิลสำหรับผู้สูงอายุ (คอลเลกชันเต็ม)
ผู้สูงอายุแบ่งออกเป็นสามขั้นตอน: การทำเครื่องหมายการนับและการรวม แนวคิดของการแบ่งใช้ที่นี่และคนรุ่นเก่าแบ่งออกเป็นหลายภูมิภาคที่มีขนาดคงที่ ในขั้นตอนการทำเครื่องหมายวัตถุที่รอดชีวิตทั้งหมดจะถูกแบ่งออกเป็นกลุ่ม N (จำนวนเธรดรีไซเคิลควรจะเหมือนกับจำนวนเธรดรีไซเคิล) แต่ละเธรดมีความรับผิดชอบอย่างอิสระสำหรับกลุ่มของตัวเองทำเครื่องหมายที่ตั้งของวัตถุที่รอดชีวิตและข้อมูลอัตราการรอดชีวิตของภูมิภาค (ภูมิภาค) และทำเครื่องหมายเป็นคู่ขนาน ในขั้นตอนทางสถิติอัตราการรอดชีวิตของแต่ละภูมิภาคจะถูกนับ โดยหลักการแล้วอัตราการรอดชีวิตที่อยู่ด้านหน้าค่อนข้างสูง จากด้านหน้าไปด้านหลังตำแหน่งเริ่มต้นที่คุ้มค่าจะถูกพบ (พื้นที่ที่วัตถุส่วนใหญ่อยู่รอดไม่คุ้มค่าที่จะรวมกัน) ขั้นตอนทางสถิติคืออนุกรม (เธรดเดี่ยว) ในขั้นตอนการผสานตามข้อมูลในขั้นตอนทางสถิติหลายเธรดคัดลอกวัตถุที่รอดชีวิตจากภูมิภาคหนึ่งไปยังอีกภูมิภาคหนึ่งในแบบคู่ขนาน
นักสะสมมาร์คกวาดพร้อมกัน
ยังเป็นที่รู้จักกันในนามนักสะสมความล่าช้าต่ำแอปพลิเคชันจะถูกระงับในเวลาที่สั้นกว่าด้วยวิธีการต่าง ๆ โดยพื้นฐานแล้วดำเนินการรีไซเคิลพร้อมกันกับแอปพลิเคชันโดยไม่รวมและคัดลอกการดำเนินการ ระบุผ่านบรรทัดคำสั่ง -xx:+USECONCMARKSWEEPGC คุณยังสามารถระบุการใช้โหมดรีไซเคิลที่เพิ่มขึ้น -XX:+USECONCMARKSWEEPGC ในระบบเดียวหรือสองคอร์ การรีไซเคิลที่เพิ่มขึ้นหมายถึงการหารการดำเนินการรีไซเคิลเป็นหลายชิ้นส่วนดำเนินการหนึ่งชิ้นส่วนและปล่อยทรัพยากร CPU ไปยังแอปพลิเคชันจากนั้นจึงรีไซเคิลผลลัพธ์สุดท้ายในอนาคต วัตถุประสงค์คือเพื่อลดความล่าช้า
collection Minor Collection สำหรับรุ่นเยาว์
เช่นเดียวกับนักสะสมคู่ขนาน
②อัลกอริทึมการรีไซเคิลสำหรับผู้สูงอายุ (คอลเลกชันเต็ม)
มันถูกแบ่งออกเป็นสี่ขั้นตอน: เครื่องหมายเริ่มต้น, เครื่องหมายพร้อมกัน, หมายเหตุและการกวาดพร้อมกัน ให้ความสนใจเป็นพิเศษไม่มีการดำเนินการผสานดังนั้นจะมีชิ้นส่วน
เครื่องมือประเมินประสิทธิภาพสำหรับ Java Garbage Collector
①xx:+printgcdetails และ xx:+printgctimestamps
ข้อมูลเกี่ยวกับเวลาเริ่มต้นระยะเวลาหน่วยความจำสำรองของแต่ละรุ่น ฯลฯ
②JMAP [ตัวเลือก] PID
JAMP 2043 ดูวัตถุที่ใช้ร่วมกันที่โหลดในกระบวนการ 2043 โดยปกติแล้วไฟล์ DLL
JMAP -HEAP 2043 ตรวจสอบข้อมูลการกำหนดค่าและการใช้กองหน่วยความจำ
JMAP -Permstat 2043 ตรวจสอบสถานะการโหลดของรุ่นถาวร
JMAP -HISTO 2043 ตรวจสอบการใช้การโหลดและการใช้หน่วยความจำของชั้นเรียน
③jstat [ตัวเลือก] PID
JSTAT -CLASS 2043 การโหลดคลาสการขนถ่ายการใช้หน่วยความจำ
สถานะการดำเนินการ JSTAT -GC 2043 GC
postscript
Java ให้บริการการเลือกอัตโนมัติและฟังก์ชั่นการเพิ่มประสิทธิภาพประสิทธิภาพอัตโนมัติ ก่อนที่จะทำการปรับจูน Garbage Collector ให้แสดงรายการตัวบ่งชี้ประสิทธิภาพที่คุณกังวลก่อนบอก JVM ว่าตัวบ่งชี้ประสิทธิภาพที่คุณกังวลผ่านบรรทัดคำสั่งและปรับโดย JVM โดยอัตโนมัติ หากคุณไม่พอใจคุณสามารถระบุตัวเก็บขยะ OutofMemory มักเกิดจากหน่วยความจำฮีปไม่เพียงพอดังนั้นคุณสามารถปรับ -xmx1024m และ -xx: Maxpermsize = บรรทัดคำสั่ง 128m
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น