เมื่อวันที่ 19 สิงหาคม Oracle เปิดตัว JDK 8u20 JDK 8u20 มีคุณสมบัติใหม่มากมาย เช่น การอัพเดตคอมไพเลอร์ Java การรองรับการแก้ไขพารามิเตอร์ MinHeapFreeRatio และ MaxHeapFreeRatio ผ่าน API ณ รันไทม์ และเอกสารคำแนะนำการปรับแต่ง GC ใหม่ อย่างไรก็ตาม ในบรรดาคุณสมบัติใหม่มากมาย สิ่งที่คาดหวังมากที่สุดคือการขจัดข้อมูลซ้ำซ้อนของสตริง วิธีลดการใช้หน่วยความจำเป็นหัวข้อที่ไม่สิ้นสุดเสมอไป ในแอปพลิเคชัน Java มักจะเห็นว่าวัตถุ String ใช้พื้นที่หน่วยความจำของแอปพลิเคชันถึง 30% มันเป็นหนึ่งในวัตถุที่ใช้บ่อยที่สุดใน Java คุณลักษณะการขจัดข้อมูลซ้ำซ้อนของสตริงใหม่สามารถช่วยลดพื้นที่หน่วยความจำของออบเจ็กต์ String ในแอปพลิเคชัน ในปัจจุบัน คุณลักษณะนี้พร้อมใช้งานสำหรับตัวรวบรวมขยะ G1 เท่านั้น และไม่ได้เปิดใช้งานตามค่าเริ่มต้น
Fabian Lange อธิบายวิธีการใช้งานการขจัดข้อมูลซ้ำซ้อนของสตริง:
คัดลอกรหัสรหัสดังต่อไปนี้:
ตัวรวบรวมขยะจะทำเครื่องหมายอาร์เรย์อักขระของวัตถุ String เมื่อมีการเข้าถึง และบันทึกค่าแฮชของ String และการอ้างอิงที่อ่อนแอลงในอาร์เรย์ เมื่อตัวรวบรวมขยะพบวัตถุสตริงอื่นที่มีค่าแฮเดียวกัน จะเปรียบเทียบอักขระทั้งสองวัตถุตามอักขระ หากตรงกันทุกประการ สตริงหนึ่งจะถูกแก้ไขให้ชี้ไปที่อาร์เรย์อักขระของสตริงอื่น เนื่องจากอาร์เรย์อักขระตัวแรกไม่ได้ถูกอ้างอิงอีกต่อไป จึงสามารถรีไซเคิลได้ ตัวรวบรวมขยะจะพยายามลดต้นทุนของการดำเนินการทั้งหมด ตัวอย่างเช่น หากสแกนออบเจ็กต์ String และไม่พบรายการที่ซ้ำกัน ก็จะไม่ถูกตรวจสอบอีกครั้งในช่วงเวลาถัดไป
ต่อไป Fabian Lange อธิบายเอฟเฟกต์มหัศจรรย์ของการขจัดข้อมูลซ้ำซ้อนของสตริงผ่านโค้ด ขั้นแรกให้รันโค้ดต่อไปนี้โดยใช้ Java 8 Update 20 พร้อมพารามิเตอร์ -Xmx256m -XX:+UseG1GC:
คัดลอกรหัสรหัสดังต่อไปนี้:
คลาสสาธารณะ LotOfStrings {
LinkedList สุดท้ายแบบคงที่ส่วนตัว LOTS_OF_STRINGS = LinkedList ใหม่ <>();
โมฆะคงที่สาธารณะ main (String [] args) พ่นข้อยกเว้น {
การวนซ้ำภายใน = 0;
ในขณะที่ (จริง) {
สำหรับ (int i = 0; i < 100; i++) {
สำหรับ (int j = 0; j < 1,000; j ++) {
LOTS_OF_STRINGS.add(สตริงใหม่("สตริง" + j));
-
-
วนซ้ำ++;
System.out.println("การวนซ้ำที่รอดชีวิต: " + การวนซ้ำ);
เธรด.สลีป(100);
-
-
-
รหัสจะสิ้นสุดการทำงานเนื่องจากข้อยกเว้น OutOfMemoryError หลังจาก 30 ลูป หลังจากใช้พารามิเตอร์ -XX:+UseStringDeduplication -XX:+PrintStringDeduplicationStatistics เพื่อเปิดใช้งานคุณลักษณะการขจัดข้อมูลซ้ำซ้อนของสตริง โปรแกรมสามารถทำงานได้เป็นระยะเวลานานขึ้น คุณยังสามารถเรียนรู้เพิ่มเติมเกี่ยวกับรายละเอียดของกระบวนการขจัดความซ้ำซ้อนทั้งหมดผ่านบันทึก JVM ขอให้ผู้อ่านทดสอบด้วยตนเอง
สุดท้ายนี้ Fabian Lange ยังอธิบายความแตกต่างระหว่างการขจัดข้อมูลซ้ำซ้อนของสตริงและถิ่นที่อยู่ของสตริง ซึ่งคล้ายกันมาก ยกเว้นว่าถิ่นที่อยู่ของสตริงจะนำอินสแตนซ์ String ทั้งหมดกลับมาใช้ใหม่ ในขณะที่การขจัดข้อมูลซ้ำซ้อนของสตริงกำหนดเป้าหมายเฉพาะอาร์เรย์อักขระของ String
(จบข้อความฉบับเต็ม)