บทนำ: การวิเคราะห์หลบหนีเป็นจุดทางเทคนิคที่ไม่ได้ใช้ในเทคโนโลยี JVM หลายแห่ง บทความนี้จะวิเคราะห์สถานการณ์การใช้งานผ่านตัวอย่าง
การวิเคราะห์ Escape เป็นอัลกอริทึมการวิเคราะห์การไหลของข้อมูลข้ามสายงานที่สามารถลดแรงดันการจัดสรรการจัดสรรหน่วยความจำในโปรแกรม Java ได้อย่างมีประสิทธิภาพ ผ่านการวิเคราะห์หลบหนีคอมไพเลอร์ Java Hotspot สามารถวิเคราะห์ขอบเขตการใช้การอ้างอิงของวัตถุใหม่และพิจารณาว่าจะจัดสรรวัตถุให้กับกองหรือไม่
ในหลักการเพิ่มประสิทธิภาพของคอมไพเลอร์ภาษาคอมพิวเตอร์การวิเคราะห์หลบหนีหมายถึงวิธีการวิเคราะห์ช่วงไดนามิกของพอยน์เตอร์ซึ่งเกี่ยวข้องกับการวิเคราะห์ตัวชี้และการวิเคราะห์ลักษณะของหลักการเพิ่มประสิทธิภาพคอมไพเลอร์ เมื่อมีการจัดสรรตัวแปร (หรือวัตถุ) ในวิธีการตัวชี้ของมันอาจถูกส่งคืนหรืออ้างอิงทั่วโลกซึ่งจะอ้างอิงโดยกระบวนการหรือเธรดอื่น ๆ ปรากฏการณ์นี้เรียกว่าการหลบหนีของตัวชี้ (หรือการอ้างอิง)
Java รองรับและเปิดใช้งานตัวเลือกการวิเคราะห์หลบหนีใน Java SE 6U23 และรุ่นใหม่กว่า คอมไพเลอร์ฮอตสปอตของ Java สามารถทำการวิเคราะห์หลบหนีบนรหัสเมื่อวิธีการมากเกินไปหรือโหลดแบบไดนามิก ในเวลาเดียวกันลักษณะของวัตถุ Java ที่จัดสรรบนฮีปและเธรดในตัวทำให้การวิเคราะห์การหลบหนีเป็นฟังก์ชั่นที่สำคัญของ Java
ย่อหน้าข้างต้นเป็นข้อความที่ฉันอ้างจากคนอื่น บทความใช้คำศัพท์มืออาชีพจำนวนมาก ให้ฉันสรุปความหมายของมัน:
การวิเคราะห์หลบหนีใช้เพื่อตรวจสอบว่ามีการจัดสรรอินสแตนซ์หรือตัวแปรบางอย่างในกองหรือไม่ หากเปิดใช้งานการวิเคราะห์การหลบหนีตัวแปรเหล่านี้สามารถจัดสรรได้โดยตรงบนสแต็กแทนที่จะอยู่บนกอง พอยน์เตอร์ไปยังตัวแปรเหล่านี้สามารถอ้างอิงได้ทั่วโลกหรืออ้างอิงโดยเธรดอื่น ๆ
เปิดการตั้งค่า
ค่าเริ่มต้นเปิดใช้งานบน JDK 6U23 หรือสูงกว่า ที่นี่เราจะกำหนดการตั้งค่าอีกครั้ง:
ถูกบังคับให้เปิด
-server -xx:+DoScapeanalysis -xx:+printgcdetail -xmx10m -xms10m
การวิเคราะห์หลบหนีอย่างใกล้ชิด
-server -xx: -doescapeanalysis -xx:+printgcdetail -xmx10m -xms10m
การตรวจสอบอินสแตนซ์
รหัส:
คลาสสาธารณะ onstacktest {โมฆะคงที่สาธารณะ alloc () {byte [] b = byte ใหม่ [2]; b [0] = 1; } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {long b = system.currentTimeMillis (); สำหรับ (int i = 0; i <100000000; i ++) {alloc (); } long e = system.currentTimeMillis (); System.out.println (E - B); -เปิดผลการดำเนินการหลบหนี:
เขียนคำอธิบายรูปภาพที่นี่
การรันผลลัพธ์ของการวิเคราะห์หลบหนีไม่เปิดใช้งาน:
เขียนคำอธิบายรูปภาพที่นี่
ในการวิเคราะห์ที่นี่คือการจัดสรรวงจรข้อมูล 2 ไบต์ 10 ล้านครั้งเวลาทำงานสำหรับการหลบหนีคือ 8 milisecond ในขณะที่ unactivated คือ 956 ซึ่งเกือบ 1/120 ของ unactivated
ผลที่แตกต่างยังคงชัดเจนมาก ...
พื้นที่บนสแต็กโดยทั่วไปมีขนาดเล็กมากและสามารถเก็บการเปลี่ยนแปลงหลายอย่างและโครงสร้างข้อมูลขนาดเล็กและโครงสร้างการจัดเก็บความจุขนาดใหญ่ไม่สามารถทำได้ ตัวอย่างที่นี่คือหลายสิบล้านครั้งโดยเน้นการวิเคราะห์การหลบหนีทำให้สามารถจัดสรรได้โดยตรงจากสแต็กซึ่งลดจำนวน GCs และปรับปรุงประสิทธิภาพการดำเนินการโดยรวมของโปรแกรมอย่างมาก
ดังนั้นผลกระทบของการวิเคราะห์การหลบหนีสามารถมีผลในสถานการณ์เฉพาะซึ่งตรงกับโครงสร้างการจัดสรรตัวแปรที่มีความจุค่อนข้างเล็กที่มีความถี่สูงและจำนวนสูง