Java หรือ Japan Anti-Vivisection Association เป็นอ็อบเจ็กต์ระดับสูงที่ใช้สำหรับวัตถุประสงค์ทั่วไปและภาษาการเขียนโปรแกรมข้ามแพลตฟอร์ม ใน Java มีบทบาทสำคัญโดยการจัดการหน่วยความจำ ส่วนใหญ่จะใช้กับหน่วยความจำคอมพิวเตอร์และทำงานเป็นรูปแบบหนึ่งของการจัดการทรัพยากร
ใน Java การจัดการหน่วยความจำจะได้รับการจัดการโดยอัตโนมัติ มันแบ่งหน่วยความจำออกเป็นหน่วยความจำสแต็กและหน่วยความจำฮีป จากมุมมองของ Java ทั้งสองมีประโยชน์สำหรับวัตถุประสงค์ที่แตกต่างกันและเป็นพื้นที่หน่วยความจำที่สำคัญ
กองกับกอง
ความแตกต่างหลัก ระหว่างหน่วยความจำสแต็กและหน่วยความจำฮีปคือ โครงสร้างข้อมูลของสแต็กเป็นแบบเส้นตรง ในขณะที่โครงสร้างข้อมูลของฮีปเป็นแบบลำดับชั้น การจัดสรรหน่วยความจำสแต็กอยู่ในบล็อกที่ต่อเนื่องกัน ในทางกลับกัน การจัดสรรหน่วยความจำฮีปอยู่ในลำดับแบบสุ่ม ตัวแปรของสแต็กไม่สามารถปรับขนาดได้ ในขณะที่ตัวแปรของฮีปสามารถปรับขนาดได้
การจัดสรรหน่วยความจำสแต็กเกิดขึ้นในบล็อกหน่วยความจำที่อยู่ติดกัน โปรแกรมเมอร์ไม่ต้องกังวลเรื่องหน่วยความจำในการจัดสรรตัวแปรสแต็กและย้ายตำแหน่ง มันถูกเรียกว่าการกำหนดหน่วยความจำสแต็กเพราะในการกำหนดสแต็คการเรียกใช้ฟังก์ชันเกิดขึ้น การคอมไพล์เป็นที่รู้จักเมื่อมีการกำหนดหน่วยความจำในขณะที่คุณสมบัติถูกเรียกเมื่อตัวแปรกำหนดหน่วยความจำให้กับสแต็ก
สำหรับตัวแปรส่วนกลาง ฮีปทำงานเป็นบัฟเฟอร์ซึ่งบันทึกภาษาโปรแกรมไว้ โดยค่าเริ่มต้น ในพื้นที่หน่วยความจำฮีป ตัวแปรลูกโลกทั้งหมดจะถูกเก็บไว้ ซึ่งเป็นประโยชน์สำหรับการจัดสรรหน่วยความจำแบบไดนามิก เมื่อโปรแกรมเมอร์รันคำสั่ง หน่วยความจำจะถูกสงวนไว้เท่านั้น ชื่อฮีปไม่มีความสัมพันธ์กับโครงสร้างของข้อมูลฮีป
ตารางเปรียบเทียบระหว่าง Stack และ Heap
พารามิเตอร์ของการเปรียบเทียบ | ซ้อนกัน | กอง |
---|---|---|
การตีความ | ในหน่วยความจำ มันเป็นโครงสร้างเชิงเส้นที่ข้อมูลถูกเก็บไว้ตามลำดับ | ในหน่วยความจำ มีการจัดสรรแบบไดนามิกที่ข้อมูลทั้งหมดจะถูกจัดเก็บแบบสุ่ม |
การจัดสรรหน่วยความจำ | ในบล็อกต่อเนื่อง | สุ่มลำดับ |
ความเร็ว | เร็วขึ้น | ช้าลง |
โครงสร้างข้อมูล | เชิงเส้น | ไม่เชิงเส้น (ลำดับชั้น) |
ขนาด | แก้ไขแล้ว | ปรับขนาดได้ |
สแต็คคืออะไร?
ในคอมพิวเตอร์ยุคปัจจุบัน ทุกเธรดจะมีพื้นที่ของหน่วยความจำที่สงวนไว้และเรียกว่าสแต็ก เมื่อฟังก์ชันทำงาน ข้อมูลสถานะในเครื่องบางส่วนอาจรวมกันอยู่ด้านบนสุดของสแต็ก เมื่อฟังก์ชันออกจากความรับผิดชอบเพื่อสำรองข้อมูลจากสแต็กไปที่มัน
สแต็กมักจะเป็นประโยชน์ในการจัดเก็บตัวแปรในเครื่องให้กับฟังก์ชันที่ทำงานอยู่ในปัจจุบัน โปรแกรมเมอร์ต้องการสแต็กเพื่อจัดเก็บข้อมูลในเครื่องที่มีความยาวผันแปรได้ หากขอบเขตของหน่วยความจำอยู่บนสแต็กของเธรด หน่วยความจำจะถูกเรียกว่าการจัดสรรบนสแต็ก เช่น การจัดสรรหน่วยความจำแบบสแต็ก
กลไกหน่วยความจำสแต็กช่วยให้หน่วยความจำของระบบทำงานเป็นที่เก็บข้อมูลชั่วคราวและทำงานเหมือนบัฟเฟอร์เข้าก่อนออกก่อน ตัวชี้สแต็กคือรีจิสเตอร์ที่เป็นหนึ่งในองค์ประกอบสำคัญของการทำงานของหน่วยความจำสแต็ก ตัวชี้สแต็กระบุตำแหน่งของหน่วยความจำสแต็กปัจจุบัน และสามารถปรับได้โดยอัตโนมัติทุกครั้งที่มีการดำเนินการสแต็ก
ข้อดีบางประการของสแต็กคือการล้างออบเจ็กต์โดยอัตโนมัติ หน่วยความจำไม่สามารถเสียหายได้ง่าย และมีส่วนสำคัญในการจัดสรรและจัดสรรคืนหน่วยความจำ แม้ว่าข้อเสียบางประการของสแต็กจะมีหน่วยความจำน้อยที่สุด แต่การเข้าถึงโดยสุ่มไม่สามารถทำได้ และสแต็กโอเวอร์โฟลว์ในขณะที่สร้างอ็อบเจ็กต์มากเกินไป
ฮีปคืออะไร?
เมื่อโปรแกรมเมอร์ดำเนินการตามคำสั่ง จะมีการจัดสรรหน่วยความจำฮีปเท่านั้น หน่วยความจำประเภทนี้เรียกว่าฮีปเนื่องจากมีพื้นที่หน่วยความจำในกองเพื่อจัดสรรและยกเลิกการจัดสรร การจัดสรรหน่วยความจำนี้ไม่ปลอดภัยเนื่องจากการเข้าถึงหรือการมองเห็นข้อมูลที่จัดเก็บไว้กับเธรดทั้งหมด เวลาในการเข้าถึงหรือเวลาในการประมวลผลค่อนข้างช้าเมื่อเทียบกับหน่วยความจำแบบสแต็ก
การจัดสรรหน่วยความจำฮีปสามารถแบ่งออกเป็น:
การใช้หน่วยความจำฮีพมีข้อดีหรือข้อดีหลายประการ เช่น ตัวแปรสามารถเข้าถึงได้ทั่วโลก ไม่จำกัดขนาดหน่วยความจำ วิธีที่ใช้ในคิวลำดับความสำคัญ และเรียกใช้การรวบรวมขยะ ข้อเสียหรือข้อเสียของการใช้หน่วยความจำฮีปใช้เวลานานกว่าในการดำเนินการ การจัดการหน่วยความจำมีความซับซ้อน และใช้เวลาในการคำนวณมากกว่า
ความแตกต่างหลักระหว่าง Stack และ Heap
บทสรุป
ดังนั้นจึงสรุปได้ว่าทั้ง stack และ heap เป็นแพลตฟอร์มการจัดการหน่วยความจำที่มีบทบาทสำคัญใน Java พวกเขาทั้งสองเป็นพื้นที่หน่วยความจำหลัก แต่มีจุดประสงค์ที่แตกต่างกัน การจัดสรรหน่วยความจำสแต็กอยู่ในบล็อกที่ต่อเนื่องกัน แต่การจัดสรรหน่วยความจำฮีปอยู่ในลำดับแบบสุ่ม
หน่วยความจำ Stack สามารถเข้าถึงได้ด้วยความเร็วสูง แต่เฉพาะกับตัวแปรในเครื่องเท่านั้น ในทางกลับกัน ความเร็วในการเข้าถึงหน่วยความจำฮีปนั้นช้ากว่าเมื่อเทียบกับสแต็ก แต่อนุญาตให้เข้าถึงตัวแปรได้ทั่วโลก การจัดสรรและการจัดสรรคืนจะทำโดยอัตโนมัติในหน่วยความจำสแต็ก ในขณะที่หน่วยความจำฮีปจะทำโดยโปรแกรมเมอร์ด้วยตนเอง