ในบทช่วยสอนนี้เราจะได้เรียนรู้เกี่ยวกับนักสะสมขยะที่มีอยู่หลายแห่ง ใน Java การรวบรวมขยะเป็นกระบวนการอัตโนมัติที่สามารถแทนที่โปรแกรมเมอร์ด้วยงานที่ซับซ้อนเช่นการจัดสรรหน่วยความจำและการรีไซเคิล บทความนี้เป็นบทความที่สามในชุดการสอนการรวบรวมขยะ ในส่วนก่อนหน้า 2 เราเห็นว่าคอลเลกชันขยะทำงานอย่างไรในชวา นั่นเป็นบทความที่น่าสนใจ ฉันแนะนำให้คุณดู ส่วนแรกแนะนำคอลเลกชันขยะ Java ส่วนใหญ่รวมถึงสถาปัตยกรรม JVM โมเดลหน่วยความจำกองและคำศัพท์ Java บางส่วน
Java มีนักสะสมขยะสี่ประเภท:
เครื่องเก็บขยะอนุกรม
ตัวเก็บขยะขนาน
การสแกนแท็กที่เกิดขึ้นพร้อมกันเก็บขยะ (CMS Garbage Collector)
G1 Garbage Collector
แต่ละประเภทมีจุดแข็งและจุดอ่อนของตัวเอง ที่สำคัญเมื่อเราโปรแกรมเราสามารถเลือกประเภทตัวเก็บขยะ Garbage ผ่าน JVM เราเลือกโดยผ่านพารามิเตอร์ไปยัง JVM แต่ละประเภทแตกต่างกันมากและสามารถให้ประสิทธิภาพการใช้งานที่แตกต่างกันโดยสิ้นเชิง เป็นสิ่งสำคัญมากที่จะต้องเข้าใจตัวเก็บขยะแต่ละประเภทและเลือกตัวเลือกที่เหมาะสมตามการเลือกแอปพลิเคชัน
1. นักสะสมขยะอนุกรม
ตัวสะสมขยะอนุกรมทำงานโดยถือเธรดทั้งหมดของแอปพลิเคชัน มันถูกออกแบบมาสำหรับสภาพแวดล้อมเธรดเดียวและใช้เธรดเดียวสำหรับการรวบรวมขยะและใช้งานได้โดยการแช่แข็งเธรดแอปพลิเคชันทั้งหมดดังนั้นจึงอาจไม่เหมาะสำหรับสภาพแวดล้อมของเซิร์ฟเวอร์ เหมาะที่สุดสำหรับโปรแกรมบรรทัดคำสั่งง่ายๆ
ตัวสะสมขยะอนุกรมสามารถใช้ผ่านพารามิเตอร์ JVM -xx:+USERIALGC
2. นักสะสมขยะขนาน
ตัวเก็บขยะขนานเรียกอีกอย่างว่า RiemputCollector มันเป็นตัวสะสมขยะเริ่มต้นสำหรับ JVM ซึ่งแตกต่างจากนักสะสมขยะอนุกรมมันใช้มัลติเธรดสำหรับการรวบรวมขยะ ในทำนองเดียวกันมันยังค้างหัวข้อแอปพลิเคชันทั้งหมดเมื่อทำการรวบรวมขยะ
3. สแกนสแกนมาร์คพร้อมกัน
คอลเลกชันแท็ก Garbage พร้อมกันใช้การสแกนแบบมัลติเธรดของหน่วยความจำฮีปการทำเครื่องหมายอินสแตนซ์ที่ต้องทำความสะอาดและทำความสะอาดอินสแตนซ์ที่ทำเครื่องหมายไว้ ตัวเก็บขยะแท็กที่เกิดขึ้นพร้อมกันจะเก็บเธรดทั้งหมดของแอปพลิเคชันทั้งหมดในสองกรณีต่อไปนี้
เมื่อวัตถุอ้างอิงที่ติดแท็กอยู่ในพื้นที่ที่ดำรงตำแหน่ง
ในระหว่างการรวบรวมขยะข้อมูลในหน่วยความจำฮีปจะเปลี่ยนไปพร้อมกัน
TAG Scanning Garbage Collector ใช้ CPU มากขึ้นเพื่อให้แน่ใจว่าโปรแกรมผ่านโปรแกรมเก็บขยะขนาน หากเราสามารถจัดสรร CPU ให้มากขึ้นเพื่อประสิทธิภาพของโปรแกรมที่ดีขึ้นมาร์กอัปพร้อมกันในตัวสะสมขยะสแกนเป็นตัวเลือกที่ดีกว่าตัวเก็บขยะที่เกิดขึ้นพร้อมกัน
เปิดตัวเก็บขยะสแกนมาร์คพร้อมกันผ่านพารามิเตอร์ JVM XX: + USEPARNEWGC
4. G1 Garbage Collector
G1 Garbage Collector เหมาะสำหรับสถานการณ์ที่หน่วยความจำกองมีขนาดใหญ่ มันแบ่งหน่วยความจำกองออกเป็นพื้นที่ต่าง ๆ และขยะเก็บรวบรวมพร้อมกัน G1 ยังสามารถบีบอัดพื้นที่หน่วยความจำกองที่เหลือหลังจากการเรียกคืนหน่วยความจำ การสแกนที่เกิดขึ้นพร้อมกันทำเครื่องหมายตัวสะสมขยะบีบอัดหน่วยความจำในเคส STW G1 Garbage Collection จะให้ความสำคัญกับพื้นที่ที่มีขยะมากที่สุดในชิ้นแรก
ใช้ G1 Garbage Collector ผ่านพารามิเตอร์ JVM XX:+USEG1GC
คุณสมบัติใหม่ของ Java8
เมื่อใช้ G1 Garbage Collector ให้ใช้พารามิเตอร์ JVM -xx:+usestringDedPlication เราสามารถเพิ่มประสิทธิภาพหน่วยความจำฮีปโดยการลบสตริงที่ซ้ำกันและเก็บถ่านเพียงหนึ่งตัว [] ตัวเลือกนี้ได้รับการแนะนำใน Java8u20
เราได้ให้นักสะสมขยะ Java ทั้งสี่ซึ่งจำเป็นต้องใช้ตามสถานการณ์ของแอปพลิเคชันประสิทธิภาพของฮาร์ดแวร์และข้อกำหนดในการรับส่งข้อมูล
การกำหนดค่า JVM สำหรับการรวบรวมขยะ
การกำหนดค่าคีย์ JVM ต่อไปนี้ทั้งหมดเกี่ยวข้องกับคอลเลกชัน Java Garbage
ประเภทของตัวเก็บขยะที่ทำงาน
| การกำหนดค่า | อธิบาย |
|---|---|
| -xx:+USTERIALGC | เครื่องเก็บขยะอนุกรม |
| -xx:+useparallelgc | ตัวเก็บขยะขนาน |
| -xx:+USECONCMARKSWEEPGC | แท็กสแกนสแกนเครื่องเก็บขยะพร้อมกัน |
| -xx: parallelcmsthreads = | แท็กสแกนสแกนตัวเก็บขยะที่เกิดขึ้นพร้อมกัน = จำนวนเธรดที่ใช้ |
| -xx:+useg1gc | G1 Garbage Collector |
การกำหนดค่าที่ดีที่สุดของ GC
| การกำหนดค่า | อธิบาย |
|---|---|
| -xms | เริ่มต้นขนาดหน่วยความจำฮีป |
| -xmx | ค่าหน่วยความจำกองสูงสุด |
| -xmn | ขนาดพงศาวดาร |
| -xx: Permsize | เริ่มต้นขนาดการสร้างถาวร |
| -xx: maxpermsize | ความสามารถสูงสุดในการสร้างถาวร |
ตัวอย่างการใช้พารามิเตอร์ JVM GC
java -xmx12m -xms3m -xmn1m -xx: permsize = 20m -xx: maxpermsize = 20m -xx:+useerialgc -jar java -application.jar
สรุป
ข้างต้นเป็นเรื่องเกี่ยวกับความเข้าใจสั้น ๆ เกี่ยวกับประเภทของนักสะสมขยะ Java ในบทความนี้และฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!