JavaRush /จาวาบล็อก /Random-TH /ข้อมูลเพิ่มเติมเกี่ยวกับตัวรวบรวมขยะใน Java

ข้อมูลเพิ่มเติมเกี่ยวกับตัวรวบรวมขยะใน Java

เผยแพร่ในกลุ่ม
สวัสดี! ในการบรรยายครั้งล่าสุด เราได้ทำความคุ้นเคยกับกลไกในตัวของภาษา Java ซึ่งก็คือตัวเก็บขยะ มันทำงานในเบื้องหลังในขณะที่โปรแกรมของคุณกำลังทำงาน โดยรวบรวมวัตถุที่ไม่จำเป็นซึ่งจะถูกลบในภายหลัง วิธีนี้จะทำให้หน่วยความจำว่างสำหรับการสร้างวัตถุใหม่ในอนาคต ในการบรรยายนี้ เราจะมาดูหลักการทำงานของมันอย่างละเอียดยิ่งขึ้น ตัวอย่างเช่น วัตถุกลายเป็นสิ่งที่ไม่จำเป็นได้อย่างไรและ ณ จุดใด? แล้วคนเก็บขยะรู้เรื่องนี้ได้อย่างไร? เราจะตอบคำถามเหล่านี้ :) การบรรยายของเรามีภาพรวมมากกว่า: ไม่จำเป็นต้องท่องจำเนื้อหานี้ มีจุดมุ่งหมายเพื่อขยายขอบเขตอันไกลโพ้นของคุณเกี่ยวกับการทำงานของหน่วยความจำและคนเก็บขยะ ดังนั้นการอ่านและเรียนรู้สิ่งใหม่ ๆ สำหรับตัวคุณเองก็จะเพียงพอแล้ว :) ไปกันเลย! สิ่งแรกที่คุณต้องจำไว้คือตัวรวบรวมขยะทำงานควบคู่ไปกับโปรแกรมของคุณ มันไม่ได้เป็นส่วนหนึ่งของมันและมีฟังก์ชั่นแยกกัน เพื่ออธิบายสิ่งนี้ ในการบรรยายครั้งล่าสุด เราได้ให้การเปรียบเทียบกับเครื่องดูดฝุ่นหุ่นยนต์ อันที่จริงมันไม่ได้เป็นเช่นนั้นเสมอไป ก่อนหน้านี้ ตัวรวบรวมขยะได้รับการออกแบบในลักษณะที่ทำงานในเธรดเดียวกันกับโปรแกรมของคุณ และตามกำหนดเวลา ทุกๆ สองสามนาที มันจะเริ่มตรวจสอบการมีอยู่ของวัตถุที่ไม่จำเป็นในโปรแกรม ปัญหาคือว่าระหว่างการตรวจสอบและการรวบรวมขยะ โปรแกรมค้างและไม่ทำงาน ลองจินตนาการว่าคุณกำลังนั่งอยู่ในสำนักงานที่ทำงาน แต่แล้วก็มีสาวทำความสะอาดมาต้องล้างพื้นในห้อง เธอไล่คุณออกจากหลังคอมพิวเตอร์เป็นเวลา 5 นาที และคุณรอจนกว่าเธอจะทำความสะอาดเสร็จ ในช่วงเวลานี้คุณไม่สามารถทำงานได้ นี่คือวิธีที่ผู้รวบรวมขยะเคยทำงานโดยประมาณ :) ต่อมากลไกนี้เปลี่ยนไป และตอนนี้ตัวรวบรวมขยะทำงานในพื้นหลังโดยไม่ทำให้การทำงานของโปรแกรมช้าลง คุณรู้อยู่แล้วว่าวัตถุจะตายเมื่อไม่มีการอ้างอิงเหลืออยู่ แต่ตัวรวบรวมขยะไม่นับการอ้างอิงถึง . ประการแรกมันอาจจะค่อนข้างยาว ประการที่สองมันไม่มีประสิทธิภาพมากนัก ท้ายที่สุดแล้ว วัตถุสามารถอ้างอิงถึงกันและกันได้! ข้อมูลเพิ่มเติมเกี่ยวกับคนเก็บขยะ - 2รูปภาพนี้แสดงตัวอย่างที่วัตถุ 3 ชิ้นอ้างอิงถึงกัน แต่ไม่มีใครอ้างอิงถึงวัตถุเหล่านั้น นั่นคือไม่จำเป็นสำหรับส่วนที่เหลือของโปรแกรมในการทำงาน หากตัวรวบรวมขยะเพียงแค่นับการอ้างอิง ออบเจ็กต์ทั้ง 3 รายการนี้จะยังคงอยู่และจะไม่ทำให้หน่วยความจำว่าง: มีการอ้างอิงถึงสิ่งเหล่านั้น! สามารถเทียบได้กับยานอวกาศ ในระหว่างการบิน นักบินอวกาศตัดสินใจตรวจสอบรายการอะไหล่เพื่อการซ่อมแซม และพบว่ามีพวงมาลัยและแป้นเหยียบจากรถยนต์ธรรมดาอยู่ด้วย เห็นได้ชัดว่าไม่จำเป็นต้องใช้ที่นี่และใช้พื้นที่เพิ่มเติม แม้ว่าชิ้นส่วนเหล่านี้จะเชื่อมต่อกันและมีหน้าที่บางอย่าง แต่ภายในกรอบการทำงานของยานอวกาศพวกมันก็ไม่ใช่ขยะที่ไม่จำเป็นซึ่งดีกว่าที่จะกำจัด ดังนั้น Java จึงตัดสินใจสร้างพื้นฐานสำหรับการรวบรวมขยะโดยไม่นับการอ้างอิง แต่แบ่งวัตถุออกเป็นสองประเภท - เข้าถึงได้และไม่สามารถเข้าถึงได้. จะทราบได้อย่างไรว่าวัตถุนั้นสามารถเข้าถึงได้หรือไม่? ทุกสิ่งที่ชาญฉลาดนั้นเรียบง่าย วัตถุสามารถเข้าถึงได้หากมีการอ้างอิงโดยวัตถุที่เข้าถึงได้อื่น ส่งผลให้เกิด "ห่วงโซ่แห่งการเข้าถึง" เริ่มต้นเมื่อโปรแกรมเริ่มต้นและดำเนินต่อไปตลอดระยะเวลาการทำงาน มีลักษณะดังนี้: ข้อมูลเพิ่มเติมเกี่ยวกับคนเก็บขยะ - 4ลูกศรในรูปแสดงถึงโค้ดที่กำลังรันโปรแกรมของเรา ในโค้ด เช่น ในเมธอด main() การอ้างอิงถึงอ็อบเจ็กต์จะถูกสร้างขึ้น ออบเจ็กต์เหล่านี้สามารถอ้างอิงถึงออบเจ็กต์ใหม่ บางอย่างเพิ่มเติม และอื่นๆ สายโซ่ของการเชื่อมโยงวัตถุถูกสร้างขึ้น หากสามารถเข้าถึงออบเจ็กต์ผ่านห่วงโซ่ของลิงก์นี้ไปยัง "ลิงก์รูท" ซึ่งก็คือลิงก์ที่สร้างขึ้นโดยตรงในโค้ดที่รัน จะถือว่าสามารถเข้าถึงได้ ในภาพของเรามีการระบุด้วยสีน้ำเงิน แต่ถ้าวัตถุหลุดออกจากสายโซ่นี้ นั่นคือไม่มีตัวแปรใดในโค้ดที่กำลังดำเนินการอยู่ซึ่งมีการอ้างอิงถึงวัตถุนั้น และก็ไม่สามารถเข้าถึงได้ผ่าน "สายโซ่ของลิงก์" - ถือว่าไม่สามารถเข้าถึงได้ ในโปรแกรมของเรา วัตถุดังกล่าวสองรายการจะแสดงด้วยสีแดง โปรดทราบ: วัตถุ "สีแดง" เหล่านี้มีลิงก์เชื่อมโยงถึงกัน แต่อย่างที่เราบอกไปก่อนหน้านี้ ตัวรวบรวมขยะสมัยใหม่ใน Java ไม่ได้ทำการนับการอ้างอิง จะกำหนด ว่าวัตถุ สามารถเข้าถึงได้หรือไม่สามารถเข้าถึงได้ ดังนั้นวัตถุสีแดงสองชิ้นในภาพจึงตกเป็นเหยื่อของเขา ตอนนี้เรามาดูกระบวนการทั้งหมดตั้งแต่ต้นจนจบ และในเวลาเดียวกันเรามาดูกันว่าหน่วยความจำทำงานอย่างไรใน Java :) ออบเจ็กต์ทั้งหมดใน Java จะถูกจัดเก็บไว้ในพื้นที่หน่วยความจำพิเศษที่เรียกว่าฮีป ในภาษาทั่วไป "ฮีป" คือกลุ่มวัตถุที่กองรวมกันเป็นกอง แต่ฮีปใน Java ไม่ใช่แบบนั้น มีโครงสร้างที่สมเหตุสมผลและสมเหตุสมผลมาก วันหนึ่ง โปรแกรมเมอร์ Java ค้นพบว่าวัตถุทั้งหมดในโปรแกรมสามารถแบ่งออกเป็นสองประเภท - วัตถุที่ค่อนข้างพูดวัตถุธรรมดาและ วัตถุ ที่"มีอายุยืนยาว" วัตถุที่มีอายุยืนยาวคือวัตถุที่รอดพ้นจากการสะสมขยะจำนวนมาก ส่วนใหญ่มักจะมีอยู่จนกระทั่งสิ้นสุดโปรแกรม เป็นผลให้ฮีปทั่วไปซึ่งจัดเก็บวัตถุที่สร้างขึ้นทั้งหมดถูกแบ่งออกเป็นหลายส่วน ส่วนแรกมีชื่อที่สวยงาม - เอเดน ("สวนเอเดน" ในพระคัมภีร์ไบเบิล) นี่เป็นชื่อที่ดีเพราะนี่คือจุดที่วัตถุต่างๆ ถูกสร้างขึ้นหลังจากที่พวกมันถูกสร้างขึ้น ในส่วนนี้จะมีการจัดสรรหน่วยความจำสำหรับวัตถุใหม่เมื่อเราเขียนnew. คุณสามารถสร้างวัตถุได้มากมาย และเมื่อพื้นที่ในบริเวณนี้หมด การรวบรวมขยะครั้งแรกที่ "รวดเร็ว" จะเริ่มต้นขึ้น ต้องบอกว่าตัวรวบรวมขยะฉลาดมากและเลือกอัลกอริธึมการทำงานขึ้นอยู่กับว่ามีอะไรมากกว่านั้นในฮีป - ขยะหรือวัตถุทำงาน หากวัตถุเกือบทั้งหมดเป็นขยะ ตัวรวบรวมจะทำเครื่องหมายวัตถุที่ "ใช้งานจริง" และย้ายไปยังพื้นที่หน่วยความจำอื่น หลังจากนั้นพื้นที่ปัจจุบันจะถูกล้างให้หมด หากมีขยะเพียงเล็กน้อยและส่วนใหญ่เต็มไปด้วยสิ่งมีชีวิต มันจะทำเครื่องหมายขยะ ทำความสะอาด และจัดเรียงสิ่งของที่เหลือ เราพูดว่า “นักสะสมทำเครื่องหมายวัตถุ “มีชีวิต” และย้ายมันไปยังตำแหน่งความทรงจำอื่น” แต่อันไหนล่ะ? พื้นที่หน่วยความจำที่วัตถุทั้งหมดที่รอดชีวิตจากการรวบรวมขยะอย่างน้อยหนึ่งรายการถูกถ่ายโอนเรียกว่าSurvival Space Survival Space ในทาง กลับกัน แบ่งออกเป็นรุ่น แต่ละออบเจ็กต์ได้รับการกำหนดรุ่นตามจำนวนคอลเลกชันขยะที่ออบเจ็กต์ได้รับ หากมีอย่างใดอย่างหนึ่ง ก็จะเป็นของ "รุ่นที่ 1" ถ้า 5 - เป็น "รุ่นที่ 5" เมื่อร่วมมือกัน Eden และ Survival Space จะสร้างพื้นที่ที่เรียกว่าYoung Generation นอกจาก Young Generation แล้ว ยังมีอีกพื้นที่หน่วยความจำในฮีป - Old Generation (“รุ่นเก่า”) สิ่งเหล่านี้เป็นวัตถุที่มีอายุยืนยาวมากซึ่งรอดพ้นจากการรวบรวมขยะจำนวนมาก จะทำกำไรได้มากกว่าหากจัดเก็บแยกจากที่อื่นทั้งหมด และเฉพาะเมื่อพื้นที่ Old Generation เต็มเท่านั้นคือ แม้ว่าจะมีอ็อบเจ็กต์ที่มีอายุยาวนานจำนวนมากในโปรแกรมจนมีหน่วยความจำไม่เพียงพอ ก็ยังดำเนินการรวบรวมขยะทั้งหมด มันประมวลผลไม่ใช่แค่พื้นที่หน่วยความจำเดียว แต่โดยทั่วไปแล้วอ็อบเจ็กต์ทั้งหมดที่สร้างโดยเครื่อง Java โดยปกติแล้วจะใช้เวลาและทรัพยากรมากกว่ามาก นั่นคือเหตุผลว่าทำไมจึงตัดสินใจเก็บวัตถุที่มีอายุยืนแยกกัน เมื่อพื้นที่ในพื้นที่อื่นหมดจะเรียกว่า “การเก็บขยะอย่างรวดเร็ว” ครอบคลุมพื้นที่เดียวเท่านั้นและด้วยเหตุนี้จึงประหยัดและรวดเร็วยิ่งขึ้น ท้ายที่สุด เมื่อแม้แต่พื้นที่สำหรับคนอายุ 100 ปีก็อุดตัน การทำความสะอาดอย่างเต็มรูปแบบก็เข้าสู่การต่อสู้ ดังนั้นผู้ประกอบจึงใช้เครื่องมือที่ "หนัก" ที่สุดเมื่อไม่จำเป็นอีกต่อไปเท่านั้น โครงสร้างของฮีปและการทำความสะอาดตามแผนผังมีลักษณะดังนี้: ข้อมูลเพิ่มเติมเกี่ยวกับคนเก็บขยะ - 5
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION