ความแตกต่างระหว่าง Stack และ Heap (พร้อมตาราง)

สารบัญ:

Anonim

Java หรือ Japan Anti-Vivisection Association เป็นอ็อบเจ็กต์ระดับสูงที่ใช้สำหรับวัตถุประสงค์ทั่วไปและภาษาการเขียนโปรแกรมข้ามแพลตฟอร์ม ใน Java มีบทบาทสำคัญโดยการจัดการหน่วยความจำ ส่วนใหญ่จะใช้กับหน่วยความจำคอมพิวเตอร์และทำงานเป็นรูปแบบหนึ่งของการจัดการทรัพยากร

ใน Java การจัดการหน่วยความจำจะได้รับการจัดการโดยอัตโนมัติ มันแบ่งหน่วยความจำออกเป็นหน่วยความจำสแต็กและหน่วยความจำฮีป จากมุมมองของ Java ทั้งสองมีประโยชน์สำหรับวัตถุประสงค์ที่แตกต่างกันและเป็นพื้นที่หน่วยความจำที่สำคัญ

กองกับกอง

ความแตกต่างหลัก ระหว่างหน่วยความจำสแต็กและหน่วยความจำฮีปคือ โครงสร้างข้อมูลของสแต็กเป็นแบบเส้นตรง ในขณะที่โครงสร้างข้อมูลของฮีปเป็นแบบลำดับชั้น การจัดสรรหน่วยความจำสแต็กอยู่ในบล็อกที่ต่อเนื่องกัน ในทางกลับกัน การจัดสรรหน่วยความจำฮีปอยู่ในลำดับแบบสุ่ม ตัวแปรของสแต็กไม่สามารถปรับขนาดได้ ในขณะที่ตัวแปรของฮีปสามารถปรับขนาดได้

การจัดสรรหน่วยความจำสแต็กเกิดขึ้นในบล็อกหน่วยความจำที่อยู่ติดกัน โปรแกรมเมอร์ไม่ต้องกังวลเรื่องหน่วยความจำในการจัดสรรตัวแปรสแต็กและย้ายตำแหน่ง มันถูกเรียกว่าการกำหนดหน่วยความจำสแต็กเพราะในการกำหนดสแต็คการเรียกใช้ฟังก์ชันเกิดขึ้น การคอมไพล์เป็นที่รู้จักเมื่อมีการกำหนดหน่วยความจำในขณะที่คุณสมบัติถูกเรียกเมื่อตัวแปรกำหนดหน่วยความจำให้กับสแต็ก

สำหรับตัวแปรส่วนกลาง ฮีปทำงานเป็นบัฟเฟอร์ซึ่งบันทึกภาษาโปรแกรมไว้ โดยค่าเริ่มต้น ในพื้นที่หน่วยความจำฮีป ตัวแปรลูกโลกทั้งหมดจะถูกเก็บไว้ ซึ่งเป็นประโยชน์สำหรับการจัดสรรหน่วยความจำแบบไดนามิก เมื่อโปรแกรมเมอร์รันคำสั่ง หน่วยความจำจะถูกสงวนไว้เท่านั้น ชื่อฮีปไม่มีความสัมพันธ์กับโครงสร้างของข้อมูลฮีป

ตารางเปรียบเทียบระหว่าง Stack และ Heap

พารามิเตอร์ของการเปรียบเทียบ ซ้อนกัน กอง
การตีความ ในหน่วยความจำ มันเป็นโครงสร้างเชิงเส้นที่ข้อมูลถูกเก็บไว้ตามลำดับ ในหน่วยความจำ มีการจัดสรรแบบไดนามิกที่ข้อมูลทั้งหมดจะถูกจัดเก็บแบบสุ่ม
การจัดสรรหน่วยความจำ ในบล็อกต่อเนื่อง สุ่มลำดับ
ความเร็ว เร็วขึ้น ช้าลง
โครงสร้างข้อมูล เชิงเส้น ไม่เชิงเส้น (ลำดับชั้น)
ขนาด แก้ไขแล้ว ปรับขนาดได้

สแต็คคืออะไร?

ในคอมพิวเตอร์ยุคปัจจุบัน ทุกเธรดจะมีพื้นที่ของหน่วยความจำที่สงวนไว้และเรียกว่าสแต็ก เมื่อฟังก์ชันทำงาน ข้อมูลสถานะในเครื่องบางส่วนอาจรวมกันอยู่ด้านบนสุดของสแต็ก เมื่อฟังก์ชันออกจากความรับผิดชอบเพื่อสำรองข้อมูลจากสแต็กไปที่มัน

สแต็กมักจะเป็นประโยชน์ในการจัดเก็บตัวแปรในเครื่องให้กับฟังก์ชันที่ทำงานอยู่ในปัจจุบัน โปรแกรมเมอร์ต้องการสแต็กเพื่อจัดเก็บข้อมูลในเครื่องที่มีความยาวผันแปรได้ หากขอบเขตของหน่วยความจำอยู่บนสแต็กของเธรด หน่วยความจำจะถูกเรียกว่าการจัดสรรบนสแต็ก เช่น การจัดสรรหน่วยความจำแบบสแต็ก

กลไกหน่วยความจำสแต็กช่วยให้หน่วยความจำของระบบทำงานเป็นที่เก็บข้อมูลชั่วคราวและทำงานเหมือนบัฟเฟอร์เข้าก่อนออกก่อน ตัวชี้สแต็กคือรีจิสเตอร์ที่เป็นหนึ่งในองค์ประกอบสำคัญของการทำงานของหน่วยความจำสแต็ก ตัวชี้สแต็กระบุตำแหน่งของหน่วยความจำสแต็กปัจจุบัน และสามารถปรับได้โดยอัตโนมัติทุกครั้งที่มีการดำเนินการสแต็ก

ข้อดีบางประการของสแต็กคือการล้างออบเจ็กต์โดยอัตโนมัติ หน่วยความจำไม่สามารถเสียหายได้ง่าย และมีส่วนสำคัญในการจัดสรรและจัดสรรคืนหน่วยความจำ แม้ว่าข้อเสียบางประการของสแต็กจะมีหน่วยความจำน้อยที่สุด แต่การเข้าถึงโดยสุ่มไม่สามารถทำได้ และสแต็กโอเวอร์โฟลว์ในขณะที่สร้างอ็อบเจ็กต์มากเกินไป

ฮีปคืออะไร?

เมื่อโปรแกรมเมอร์ดำเนินการตามคำสั่ง จะมีการจัดสรรหน่วยความจำฮีปเท่านั้น หน่วยความจำประเภทนี้เรียกว่าฮีปเนื่องจากมีพื้นที่หน่วยความจำในกองเพื่อจัดสรรและยกเลิกการจัดสรร การจัดสรรหน่วยความจำนี้ไม่ปลอดภัยเนื่องจากการเข้าถึงหรือการมองเห็นข้อมูลที่จัดเก็บไว้กับเธรดทั้งหมด เวลาในการเข้าถึงหรือเวลาในการประมวลผลค่อนข้างช้าเมื่อเทียบกับหน่วยความจำแบบสแต็ก

การจัดสรรหน่วยความจำฮีปสามารถแบ่งออกเป็น:

การใช้หน่วยความจำฮีพมีข้อดีหรือข้อดีหลายประการ เช่น ตัวแปรสามารถเข้าถึงได้ทั่วโลก ไม่จำกัดขนาดหน่วยความจำ วิธีที่ใช้ในคิวลำดับความสำคัญ และเรียกใช้การรวบรวมขยะ ข้อเสียหรือข้อเสียของการใช้หน่วยความจำฮีปใช้เวลานานกว่าในการดำเนินการ การจัดการหน่วยความจำมีความซับซ้อน และใช้เวลาในการคำนวณมากกว่า

ความแตกต่างหลักระหว่าง Stack และ Heap

บทสรุป

ดังนั้นจึงสรุปได้ว่าทั้ง stack และ heap เป็นแพลตฟอร์มการจัดการหน่วยความจำที่มีบทบาทสำคัญใน Java พวกเขาทั้งสองเป็นพื้นที่หน่วยความจำหลัก แต่มีจุดประสงค์ที่แตกต่างกัน การจัดสรรหน่วยความจำสแต็กอยู่ในบล็อกที่ต่อเนื่องกัน แต่การจัดสรรหน่วยความจำฮีปอยู่ในลำดับแบบสุ่ม

หน่วยความจำ Stack สามารถเข้าถึงได้ด้วยความเร็วสูง แต่เฉพาะกับตัวแปรในเครื่องเท่านั้น ในทางกลับกัน ความเร็วในการเข้าถึงหน่วยความจำฮีปนั้นช้ากว่าเมื่อเทียบกับสแต็ก แต่อนุญาตให้เข้าถึงตัวแปรได้ทั่วโลก การจัดสรรและการจัดสรรคืนจะทำโดยอัตโนมัติในหน่วยความจำสแต็ก ในขณะที่หน่วยความจำฮีปจะทำโดยโปรแกรมเมอร์ด้วยตนเอง

อ้างอิง

ความแตกต่างระหว่าง Stack และ Heap (พร้อมตาราง)