1. ตัวรวบรวมขยะทำงานอย่างไรใน Java
ตัวรวบรวมขยะเป็นกระบวนการที่มีลำดับความสำคัญต่ำที่ทำงานเป็นระยะๆ และเพิ่มหน่วยความจำที่ใช้โดยอ็อบเจ็กต์ที่ไม่จำเป็นอีกต่อไป ตัวรวบรวมขยะทำงานในพื้นหลัง ควบคู่ไปกับโปรแกรม ในเธรดที่แยกจากกัน พื้นฐานสำหรับการรวบรวมขยะไม่ใช่การนับอ้างอิง แต่เป็นการแยกวัตถุออกเป็นสองประเภท - เข้าถึงได้และไม่สามารถเข้าถึงได้ วัตถุจะถือว่าสามารถเข้าถึงได้ (มีชีวิต) หากมีการอ้างอิงโดยวัตถุอื่นที่สามารถเข้าถึงได้ (มีชีวิต) ความสามารถในการเข้าถึงนับจากเธรด เธรดที่รันอยู่จะถือว่าสามารถเข้าถึงได้ (มีอยู่) เสมอ แม้ว่าจะไม่มีใครอ้างอิงถึงก็ตาม อ็อบเจ็กต์ทั้งหมดใน Java จะถูกจัดเก็บไว้ในพื้นที่หน่วยความจำพิเศษที่เรียกว่าฮีป ออบเจ็กต์ทั้งหมดในโปรแกรมสามารถแบ่งออกเป็นสองประเภท - วัตถุที่ค่อนข้างพูด วัตถุที่เรียบง่าย และวัตถุที่ "มีอายุยืนยาว" วัตถุที่มีอายุยืนยาวคือวัตถุที่รอดพ้นจากการสะสมขยะจำนวนมาก ส่วนใหญ่มักจะมีอยู่จนกระทั่งสิ้นสุดโปรแกรม เป็นผลให้ฮีปทั่วไปซึ่งจัดเก็บวัตถุที่สร้างขึ้นทั้งหมดถูกแบ่งออกเป็นหลายส่วน ส่วนแรกมีชื่อที่สวยงาม - เอเดน ("สวนเอเดนในพระคัมภีร์ไบเบิล") วัตถุต่างๆ มาที่นี่หลังจากที่ถูกสร้างขึ้น ในส่วนนี้หน่วยความจำจะถูกจัดสรรให้กับวัตถุใหม่เมื่อเราเขียนใหม่ คุณสามารถสร้างวัตถุได้มากมาย และเมื่อพื้นที่ในบริเวณนี้หมด การรวบรวมขยะครั้งแรกที่ "รวดเร็ว" จะเริ่มต้นขึ้น ต้องบอกว่าตัวรวบรวมขยะฉลาดมากและเลือกอัลกอริธึมการทำงานขึ้นอยู่กับว่ามีอะไรมากกว่านั้นในฮีป - ขยะหรือวัตถุทำงาน หากวัตถุเกือบทั้งหมดเป็นขยะ ตัวรวบรวมจะทำเครื่องหมายวัตถุที่ "ใช้งานจริง" และย้ายไปยังพื้นที่หน่วยความจำอื่น หลังจากนั้นพื้นที่ปัจจุบันจะถูกล้างให้หมด หากมีขยะเพียงเล็กน้อยและส่วนใหญ่เต็มไปด้วยสิ่งมีชีวิต มันจะทำเครื่องหมายขยะ ทำความสะอาด และจัดเรียงสิ่งของที่เหลือ พื้นที่หน่วยความจำที่วัตถุทั้งหมดที่รอดชีวิตจากการรวบรวมขยะอย่างน้อยหนึ่งรายการถูกถ่ายโอนเรียกว่า Survival Space Survival Space ในทางกลับกัน ก็แบ่งออกเป็นรุ่นต่างๆ แต่ละออบเจ็กต์ได้รับการกำหนดรุ่นตามจำนวนคอลเลกชันขยะที่ออบเจ็กต์ได้รับ หากมีอย่างใดอย่างหนึ่ง ก็จะเป็นของ "รุ่นที่ 1" ถ้า 5 - เป็น "รุ่นที่ 5" เมื่อร่วมมือกัน Eden และ Survival Space จะสร้างพื้นที่ที่เรียกว่า Young Generation นอกจาก Young Generation แล้ว ยังมีอีกพื้นที่หน่วยความจำในฮีป - Old Generation (“รุ่นเก่า”) สิ่งเหล่านี้เป็นวัตถุที่มีอายุยืนยาวมากซึ่งรอดพ้นจากการรวบรวมขยะจำนวนมาก จะทำกำไรได้มากกว่าหากจัดเก็บแยกจากที่อื่นทั้งหมด และเฉพาะเมื่อพื้นที่ Old Generation เต็มเท่านั้นคือ แม้ว่าจะมีอ็อบเจ็กต์ที่มีอายุยาวนานจำนวนมากในโปรแกรมจนมีหน่วยความจำไม่เพียงพอ ก็ยังดำเนินการรวบรวมขยะทั้งหมด มันประมวลผลไม่ใช่แค่พื้นที่หน่วยความจำเดียว แต่โดยทั่วไปแล้วอ็อบเจ็กต์ทั้งหมดที่สร้างโดยเครื่อง Java โดยปกติแล้วจะใช้เวลาและทรัพยากรมากกว่ามาก นั่นคือเหตุผลว่าทำไมจึงตัดสินใจเก็บวัตถุที่มีอายุยืนแยกกัน เมื่อพื้นที่ในพื้นที่อื่นหมดจะเรียกว่า “การเก็บขยะอย่างรวดเร็ว” ครอบคลุมพื้นที่เดียวเท่านั้นและด้วยเหตุนี้จึงประหยัดและรวดเร็วยิ่งขึ้น ในตอนท้าย เมื่อแม้แต่พื้นที่สำหรับผู้อยู่อาศัยที่มีอายุยืนยาวก็อุดตันอยู่แล้ว การทำความสะอาดอย่างเต็มรูปแบบก็เข้ามามีบทบาท ดังนั้นผู้ประกอบจึงใช้เครื่องมือที่ "หนัก" ที่สุดเมื่อไม่จำเป็นอีกต่อไปเท่านั้น
2.คนเก็บขยะมีกี่ประเภท?
Java มีตัวรวบรวมขยะเจ็ดประเภท:
- คนเก็บขยะแบบอนุกรม
- รถเก็บขยะแบบขนาน
- โปรแกรมเก็บขยะ CMS
- G1 รถเก็บขยะ
- รถเก็บขยะเอปซิลอน
- Z คนเก็บขยะ
- คนเก็บขยะเชนันโดอาห์
3. “รุ่น” ของวัตถุคืออะไร
วัตถุทั้งหมดใน Survival Space แบ่งออกเป็นรุ่น แต่ละออบเจ็กต์ได้รับการกำหนดรุ่นตามจำนวนคอลเลกชันขยะที่ออบเจ็กต์ได้รับ หากมีอย่างใดอย่างหนึ่ง ก็จะเป็นของ "รุ่นที่ 1" ถ้า 5 - เป็น "รุ่นที่ 5"
4. SoftReference ใช้ทำอะไร?
อ็อบเจ็กต์ที่อ้างอิงโดยซอฟต์อ้างอิงเท่านั้นสามารถถูกรวบรวมขยะได้หากโปรแกรมมีหน่วยความจำไม่เพียงพอ หากโปรแกรมหน่วยความจำไม่เพียงพอ ก่อนที่จะโยน OutOfMemoryException ตัวรวบรวมขยะจะลบอ็อบเจ็กต์ทั้งหมดที่อ้างอิงโดยซอฟต์ลิงก์ และพยายามจัดสรรหน่วยความจำให้กับโปรแกรมอีกครั้ง วัตถุที่ถูกป้องกันไม่ให้ตายโดย SoftReference เท่านั้นที่สามารถอยู่รอดได้จากการรวบรวมขยะจำนวนเท่าใดก็ได้ และมักจะถูกทำลายหากโปรแกรมหน่วยความจำไม่เพียงพอ
5. ตัวอย่างการใช้ SoftReference
SoftReferences ได้รับการออกแบบมาโดยเฉพาะสำหรับการแคช สมมติว่าโปรแกรมไคลเอนต์ร้องขอข้อมูลต่างๆ จากโปรแกรมเซิร์ฟเวอร์บ่อยครั้ง จากนั้นโปรแกรมเซิร์ฟเวอร์สามารถแคชบางส่วนได้โดยใช้ SoftReference สำหรับสิ่งนี้ หากวัตถุที่เก็บไว้ไม่ให้ตายโดยการอ้างอิงแบบซอฟต์ใช้พื้นที่หน่วยความจำส่วนใหญ่ ตัวรวบรวมขยะก็จะลบพวกมันออกไป เท่านี้ก็เรียบร้อย
6. ตัวอย่างการใช้ WeakReference
หากมีเพียงการอ้างอิงที่ไม่ชัดเจนไปยังวัตถุ วัตถุนี้ก็ยังมีชีวิตอยู่ แต่จะถูกทำลายในระหว่างการรวบรวมขยะครั้งถัดไป วัตถุที่ถูกป้องกันไม่ให้ตายโดย WeakReference เพียงอย่างเดียวจะไม่สามารถรอดจากการรวบรวมขยะครั้งต่อไป แต่จนกว่าจะเกิดขึ้น คุณสามารถรับมันได้โดยการเรียกเมธอด
get()
บน WeakReference แล้วเรียกเมธอดของมันหรือทำอย่างอื่น ตัวอย่างของการใช้ WeakReference คือ WeakHashMap
7. เหตุใดจึงจำเป็นต้องใช้ WeakHashMap
WeakHashMap คือ HashMap ซึ่งมีคีย์ที่มีการอ้างอิงที่ไม่รัดกุม - WeakReference คุณจัดเก็บคู่ของวัตถุไว้ใน WeakHashMap - คีย์และค่า แต่ WeakHashMap ไม่ได้อ้างอิงถึงคีย์โดยตรง แต่ผ่าน WeakReference ดังนั้นเมื่อวัตถุที่ใช้เป็นกุญแจไม่สามารถเข้าถึงได้ วัตถุเหล่านั้นจะถูกทำลายในการรวบรวมขยะครั้งถัดไป ซึ่งหมายความว่าค่าของพวกเขาจะถูกลบออกจาก WeakHashMap โดยอัตโนมัติ WeakHashMap สะดวกมากสำหรับการจัดเก็บข้อมูลเพิ่มเติมสำหรับวัตถุบางอย่าง ประการแรก มันง่ายมากที่จะได้รับหากคุณใช้วัตถุนั้นเป็นกุญแจ ประการที่สอง หากวัตถุถูกทำลาย ทั้งวัตถุและข้อมูลทั้งหมดที่เกี่ยวข้องกับวัตถุนั้นจะหายไปจาก HashMap ตัวอย่างเช่น โปรแกรมมีเธรดที่ตรวจสอบการทำงานของวัตถุงานบางอย่างและเขียนข้อมูลเกี่ยวกับวัตถุเหล่านั้นลงในบันทึก จากนั้นเธรดนี้สามารถจัดเก็บอ็อบเจ็กต์ที่ถูกติดตามใน WeakHashMap ได้ ทันทีที่วัตถุไม่จำเป็นอีกต่อไป ตัวรวบรวมขยะจะลบวัตถุเหล่านั้น และการอ้างถึงวัตถุเหล่านั้นจาก WeakHashMap จะถูกลบโดยอัตโนมัติ
8. คนตัดไม้คืออะไร
วัตถุ Logger ใช้เพื่อบันทึกข้อความสำหรับระบบหรือส่วนประกอบแอปพลิเคชันเฉพาะ บันทึกคือรายการเหตุการณ์ที่เกิดขึ้น ส่วนใหญ่แล้วข้อมูลเกี่ยวกับพารามิเตอร์เมธอดที่ถูกเรียกใช้ ข้อผิดพลาดที่ดักจับทั้งหมด และข้อมูลกลางจำนวนมากถูกเขียนลงในบันทึก กระบวนการบันทึกทั้งหมดประกอบด้วยสามส่วน
- ส่วนแรกคือการรวบรวมข้อมูล
- ส่วนที่สองคือการกรองข้อมูลที่รวบรวม
- ส่วนที่สามคือการบันทึกข้อมูลที่เลือก
9. วิธีการตั้งค่าเครื่องบันทึก
- เพิ่มการพึ่งพาให้กับ pom.xml
- เพิ่มไฟล์ log4j.properties ให้กับรีซอร์ส
โดยทั่วไป การตั้งค่าตัวบันทึก log4j จะถูกตั้งค่าในไฟล์ log4j.properties ในไฟล์นี้คุณสามารถระบุภาคผนวกได้หลายรายการ - ออบเจ็กต์ที่จะเขียนข้อมูล
- เพิ่มในชั้นเรียนด้วยตรรกะทาง
private static final Logger log = Logger.getLogger(ххх.class);
ธุรกิจ
ใช้แล้ว:
GO TO FULL VERSION