คำนำ
ฉันเขียนบทความเกี่ยวกับแผนกพื้นที่หน่วยความจำ JVM แต่เมื่อวานนี้ฉันได้รับการสัมภาษณ์กับ Ant Financial ฉันถามเกี่ยวกับเนื้อหาที่เกี่ยวข้องกับ JVM และอธิบายการแบ่งพื้นที่หน่วยความจำ JVM ส่วนนี้ค่อนข้างดี แต่ต่อมาฉันถามว่าสตริงถูกเก็บไว้ในชวา ฉันจำได้เพียงว่าสตริงเป็นปริมาณที่ไม่เปลี่ยนแปลงซึ่งควรเก็บไว้ในสระคงที่ แต่ต่อมาฉันถามว่าควรวางสตริงใหม่ซึ่งควรวางไว้ในกอง ต่อมาฉันถามว่ามีการอ้างอิงสตริงที่ไหน ในเวลานั้นฉันก็โง่และบอกว่าพวกเขายังอยู่ในกอง ตอนนี้ฉันจะสรุป: ข้อมูลตัวแปรประเภทพื้นฐานและการอ้างอิงวัตถุถูกวางไว้ในสแต็กวัตถุนั้นจะถูกวางไว้ในฮีปค่าคงที่สตริงที่ชัดเจนจะถูกวางไว้ในพูลคงที่และวางวัตถุสตริงไว้ในฮีป
คำอธิบายของพูลคงที่
ก่อนหน้านี้สระว่ายน้ำคงที่ในพื้นที่วิธีการนั่นคือมันอยู่ในรุ่นถาวรและย้ายไปที่กองเริ่มต้นจาก JDK7 การเปลี่ยนแปลงนี้สามารถเห็นได้จาก ** RFE ที่สำคัญที่กล่าวถึงใน Notes JDK 7 ใน Oracle เวอร์ชันรุ่น
พื้นที่: Hotspotsynopsis: ใน JDK 7, สตริงภายในไม่ได้รับการจัดสรรในรุ่นถาวรของกอง Java แต่แทนที่จะจัดสรรในส่วนหลักของกอง Java (รู้จักกันในชื่อรุ่นเล็กและรุ่นเก่า) พร้อมกับวัตถุอื่น ๆ ที่สร้างขึ้นโดยแอปพลิเคชัน การเปลี่ยนแปลงนี้จะส่งผลให้ข้อมูลมากขึ้นที่อยู่ในกองจาวาหลักและข้อมูลน้อยลงในรุ่นถาวรและอาจต้องปรับขนาดฮีป แอพพลิเคชั่นส่วนใหญ่จะเห็นความแตกต่างที่ค่อนข้างเล็กในการใช้งานฮีปเนื่องจากการเปลี่ยนแปลงนี้ แต่แอปพลิเคชันขนาดใหญ่ที่โหลดคลาสมากมายหรือใช้งานอย่างหนักของสตริง. intern () จะเห็นความแตกต่างที่สำคัญมากขึ้น RFE: 6962931
คำอธิบายตำแหน่งหน่วยความจำสตริง
1. ค่าคงที่สตริงที่ชัดเจน
สตริง a = "holten"; สตริง b = "holten";
•หลังจากประโยคแรกวัตถุสตริงที่มีค่า holten ถูกสร้างขึ้นในพูลคงที่
•เมื่อมีการดำเนินการประโยคที่สองเนื่องจากมี holten ในพูลคงที่วัตถุสตริงใหม่จะไม่ถูกสร้างขึ้นอีกต่อไป
•ในเวลานี้การอ้างอิงถึงสตริงอยู่ในสแต็กเครื่องเสมือน
1. วัตถุสไตรลิ่ง
สตริง a = สตริงใหม่ ("holtenobj"); สตริง b = สตริงใหม่ ("holtenobj");•เมื่อมีการโหลดคลาสวัตถุสตริงที่มีค่าของ holtenobj ถูกสร้างขึ้นในพูลคงที่ เมื่อมีการดำเนินการประโยคแรกวัตถุสตริงใหม่ ("Holtenobj") จะถูกสร้างขึ้นในกอง;
•เมื่อมีการดำเนินการประโยคที่สองเนื่องจาก Holtenobj มีอยู่ในพูลคงที่วัตถุสตริงใหม่จะไม่ถูกสร้างขึ้นอีกต่อไปและวัตถุสตริงใหม่ ("Holtenobj") จะถูกสร้างขึ้นโดยตรงในฮีป
ตรวจสอบ
/*** สร้างโดย Holten.gao เมื่อปี 2016/8/16 */คลาสสาธารณะหลัก {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {string str1 = "gao xiaotian"; string str2 = "gao xiaotian"; System.out.println (str1 == str2); // สตริงจริง str3 = สตริงใหม่ ("gao datian"); string str4 = สตริงใหม่ ("gao datian"); System.out.println (str3 == str4); // false}}ผลการส่งคืน:
Truefalse
บทความข้างต้นขึ้นอยู่กับคำอธิบายโดยละเอียดของตำแหน่งหน่วยความจำสตริงใน Java มันคือเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณ ฉันหวังว่าคุณจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น