เป็นที่เชื่อกันโดยทั่วไปว่าวัตถุที่เป็นสิ่งใหม่ทั้งหมดได้รับการจัดสรรบนกอง แต่สิ่งนี้ไม่ถูกต้องอย่างสมบูรณ์ จากการวิเคราะห์กระบวนการจัดสรรวัตถุ Java เราพบว่านอกเหนือจากการจัดสรรบนกองแล้ววัตถุยังสามารถจัดสรรพื้นที่ในสแต็กหรือ TLAB พื้นฐานทางเทคนิคสำหรับการจัดสรรวัตถุบนสแต็กคือการวิเคราะห์หลบหนีและการเปลี่ยนสเกลาร์ บทความนี้ส่วนใหญ่แนะนำการวิเคราะห์หลบหนี
คำจำกัดความของการวิเคราะห์หลบหนี
การวิเคราะห์ Escape เป็นอัลกอริทึมการวิเคราะห์การไหลของข้อมูลข้ามสายงานที่สามารถลดแรงดันการจัดสรรการจัดสรรหน่วยความจำในโปรแกรม Java ได้อย่างมีประสิทธิภาพ
ผ่านการวิเคราะห์หลบหนีคอมไพเลอร์ Java Hotspot สามารถวิเคราะห์ขอบเขตการใช้การอ้างอิงของวัตถุใหม่และพิจารณาว่าจะจัดสรรวัตถุให้กับกองหรือไม่
Java รองรับและเปิดใช้งานตัวเลือกการวิเคราะห์หลบหนีใน Java SE 6U23 และรุ่นใหม่กว่า คอมไพเลอร์ฮอตสปอตของ Java สามารถทำการวิเคราะห์การหลบหนีของรหัสเมื่อวิธีการมากเกินไปหรือโหลดแบบไดนามิก
พฤติกรรมพื้นฐานของการวิเคราะห์การหลบหนีคือการวิเคราะห์ขอบเขตแบบไดนามิกของวัตถุ: เมื่อวัตถุถูกกำหนดไว้ในวิธีการอาจอ้างอิงโดยวิธีภายนอก
วิธีการหลบหนี: ตัวอย่างเช่นผ่านเป็นพารามิเตอร์การโทรไปยังวิธีอื่น
เธรด Escape: อาจเข้าถึงได้โดยเธรดภายนอกเช่นการกำหนดค่าให้กับตัวแปรคลาสหรือตัวแปรอินสแตนซ์ที่สามารถเข้าถึงได้ในเธรดอื่น ๆ
พื้นฐานทางทฤษฎีของการวิเคราะห์หลบหนี
การวิเคราะห์หลบหนีดำเนินการตามอัลกอริทึมที่อธิบายโดย Jong-Deok Choi, Manish Gupta, Mauricio Seffano, Vugramam C. Sreedhar, Sam Midkiff และอื่น ๆ ในกระดาษ "การวิเคราะห์หลบหนีสำหรับ Java"
อัลกอริทึมนี้แนะนำกราฟที่เชื่อมต่อและใช้กราฟที่เชื่อมต่อเพื่อสร้างความสัมพันธ์ที่เข้าถึงได้ระหว่างวัตถุและการอ้างอิงวัตถุและบนพื้นฐานของสิ่งนี้มีการเสนอวิธีการวิเคราะห์การไหลของข้อมูลแบบรวม เนื่องจากอัลกอริทึมนั้นขึ้นอยู่กับบริบทและมีความไวต่อกระแสและจำลองความสัมพันธ์ที่ซ้อนกันในทุกระดับของวัตถุความแม่นยำในการวิเคราะห์จึงสูง แต่เวลาทำงานและการใช้หน่วยความจำค่อนข้างใหญ่
การใช้งานการวิเคราะห์หลบหนีส่วนใหญ่ขึ้นอยู่กับหลักฐานของ "โลกที่ปิด": วิธีการที่เป็นไปได้ทั้งหมดที่ดำเนินการได้รับการรู้จักก่อนการวิเคราะห์หลบหนีและการดำเนินการจริงของโปรแกรมจะไม่เปลี่ยนความสัมพันธ์ระหว่างการโทรระหว่างพวกเขา แต่เมื่อโปรแกรม Java จริงดำเนินการสมมติฐานดังกล่าวไม่ถือเป็นจริง คุณสมบัติหลายอย่างของโปรแกรม Java เช่นการโหลดคลาสแบบไดนามิกการเรียกฟังก์ชั่นท้องถิ่นและการเรียกโปรแกรมการเรียกโปรแกรมจะทำลายการประชุมที่เรียกว่า "โลกปิด"
การดำเนินการประมวลผลหลังการวิเคราะห์หลบหนี
หลังจากการวิเคราะห์การหลบหนีสามารถรับสถานะการหลบหนีที่เป็นไปได้สามสถานะของวัตถุ:
GlobalEscape: นั่นคือการอ้างอิงของวัตถุหลบหนีวิธีการหรือเธรด ตัวอย่างเช่นการอ้างอิงของวัตถุจะถูกคัดลอกไปยังตัวแปรคลาสหรือเก็บไว้ในวัตถุที่หลบหนีหรือการอ้างอิงของวัตถุจะถูกส่งกลับไปยังวิธีการเรียกว่าเป็นค่าส่งคืนของวิธีการ
Argescape (Escape ระดับพารามิเตอร์): นั่นคือการประยุกต์ใช้วัตถุที่ส่งผ่านไปยังวิธีการในระหว่างกระบวนการเรียกใช้วิธีการ สถานะนี้สามารถกำหนดได้โดยการวิเคราะห์รหัสไบนารีของวิธีการที่ถูกปรับ
Noescape: วัตถุที่สามารถแทนที่ด้วยสเกลาร์ วัตถุอาจไม่ได้รับการจัดสรรบนกองดั้งเดิม
คอมไพเลอร์สามารถใช้ผลลัพธ์ของการวิเคราะห์หลบหนีเพื่อเพิ่มประสิทธิภาพโปรแกรม:
วัตถุการจัดสรรฮีปกลายเป็นวัตถุการจัดสรรสแต็ก: วัตถุในวิธีการและการอ้างอิงวัตถุไม่หลบหนีดังนั้นวิธีนี้อาจถูกจัดสรรในหน่วยความจำสแต็กและเป็นเรื่องธรรมดามากสำหรับหน่วยความจำฮีป
กำจัดการซิงโครไนซ์: ค่าใช้จ่ายของการซิงโครไนซ์เธรดค่อนข้างสูงและผลที่ตามมาของการซิงโครไนซ์จะลดลงพร้อมกันและประสิทธิภาพ การวิเคราะห์ Escape สามารถกำหนดได้ว่าวัตถุนั้นสามารถเข้าถึงได้โดยเพียงเธรดเดียวเท่านั้น หากมีการเข้าถึงเพียงหนึ่งเธรดการดำเนินการซิงโครไนซ์ของวัตถุสามารถแปลงเป็นการดำเนินการโดยไม่ต้องป้องกันการซิงโครไนซ์ซึ่งสามารถปรับปรุงระดับของการเกิดขึ้นพร้อมกันและประสิทธิภาพได้อย่างมาก
การทดแทนเวกเตอร์: วิธีการวิเคราะห์หลบหนีหากคุณพบว่าโครงสร้างการจัดเก็บหน่วยความจำของวัตถุไม่จำเป็นต้องดำเนินการอย่างต่อเนื่องคุณสามารถบันทึกชิ้นส่วนและแม้แต่วัตถุทั้งหมดในการลงทะเบียน CPU ซึ่งสามารถปรับปรุงความเร็วในการเข้าถึงได้อย่างมาก