การจัดสรรหน่วยความจำ เป็นกระบวนการที่โปรแกรมคอมพิวเตอร์และบริการถูกกำหนดด้วยฟิสิคัลหรือเสมือน หน่วยความจำ พื้นที่ ในบทความนี้เราจะเรียนรู้เกี่ยวกับการจัดสรรหน่วยความจำใน และเราจะพูดถึงหน่วยความจำ Stack และ Heap
- Stack Memory คืออะไร
- คุณสมบัติที่สำคัญของหน่วยความจำแบบกองซ้อน
- เมธอดในคลาส Stack
- รหัส Java สำหรับการใช้งานสแต็ก
- Heap Space ใน Java
- คุณสมบัติหลักของหน่วยความจำฮีป
- ความแตกต่างระหว่าง Java Heap Space และ Stack Memory
- แผนภูมิเปรียบเทียบ
Stack Memory คืออะไร?
หน่วยความจำ Java Stack ใช้สำหรับการทำงานของเธรด มีค่าเฉพาะเมธอดที่มีอายุสั้นและการอ้างอิงไปยังอ็อบเจ็กต์อื่น ๆ ในฮีปที่ถูกอ้างถึงจากเมธอด
ซ้อนกัน หน่วยความจำจะถูกอ้างถึงเสมอ LIFO (เข้าก่อน - ออกครั้งสุดท้าย) ใบสั่ง. เมื่อใดก็ตามที่มีการเรียกใช้เมธอดบล็อกใหม่จะถูกสร้างขึ้นในหน่วยความจำสแต็กเพื่อให้เมธอดเก็บค่าดั้งเดิมของโลคัลและอ้างอิงไปยังอ็อบเจ็กต์อื่นในเมธอด
ทันทีที่วิธีนี้สิ้นสุดลงบล็อกจะไม่ได้ใช้งานและพร้อมใช้งานสำหรับวิธีถัดไป
อัลกอริทึมการจัดเรียง c ++
ขนาดหน่วยความจำแบบกองซ้อนน้อยมากเมื่อเทียบกับหน่วยความจำฮีป
คุณสมบัติที่สำคัญของหน่วยความจำแบบกองซ้อน
นอกเหนือจากสิ่งที่เราได้พูดคุยกันไปแล้วยังมีคุณสมบัติอื่น ๆ อีกดังต่อไปนี้ ซ้อนกัน หน่วยความจำ:
- มันจะเติบโตและหดตัวเมื่อมีการเรียกวิธีการใหม่และส่งคืนตามลำดับ
- ตัวแปรภายในสแต็กจะมีอยู่ตราบเท่าที่เมธอดที่สร้างขึ้นนั้นทำงานอยู่
- มันคือ โดยอัตโนมัติ จัดสรรและยกเลิกการจัดสรรเมื่อเมธอดดำเนินการเสร็จสิ้น
- หากหน่วยความจำเต็ม Java จะพ่น java.lang.StackOverFlowError
- การเข้าถึงหน่วยความจำนี้คือ เร็ว เมื่อเทียบกับหน่วยความจำฮีป
- ความทรงจำนี้คือ เธรดปลอดภัย เนื่องจากแต่ละเธรดทำงานในสแต็กของตัวเอง
เมธอดในคลาส Stack
- พุชวัตถุ ( องค์ประกอบวัตถุ ): พุชองค์ประกอบที่ด้านบนของสแต็ก
- ป๊อปวัตถุ (): ลบและส่งคืนองค์ประกอบบนสุดของสแต็ก อัน 'EmptyStackException' ข้อยกเว้นจะเกิดขึ้นถ้าเราเรียก pop () เมื่อสแต็กที่เรียกใช้ว่างเปล่า
- มองวัตถุ (): ส่งคืนองค์ประกอบที่ด้านบนของสแต็ก แต่ไม่ได้ลบออก
- บูลีนว่าง (): มันจะคืนค่าเป็นจริงถ้าไม่มีอะไรอยู่ด้านบนของสแต็ก มิฉะนั้นจะส่งกลับเท็จ
- การค้นหา int ( องค์ประกอบวัตถุ ): กำหนดว่ามีวัตถุอยู่ในสแต็กหรือไม่ หากพบองค์ประกอบจะส่งคืนตำแหน่งขององค์ประกอบจากด้านบนของสแต็ก. มิฉะนั้นจะคืนค่า -1
รหัส Java สำหรับการใช้งานสแต็ก
import java.io. * import java.util. * class Test {static void stack_push (Stack stack) {สำหรับ (int i = 0 i<5 i++){ stack.push(i) } } static void stack_pop(Stack stack){ System.out.println('Pop :') for(int i = 0 i < 5 i++){ Integer y = (Integer) stack.pop() System.out.println(y) } } static void stack_peek(Stack stack){ Integer element = (Integer) stack.peek() System.out.println('Element on stack top : ' + element) } static void stack_search(Stack stack, int element){ Integer pos = (Integer) stack.search(element) if(pos == -1) System.out.println('Element not found') else System.out.println('Element is found at position ' + pos) } public static void main (String[] args){ Stack stack = new Stack() stack_push(stack) stack_pop(stack) stack_push(stack) stack_peek(stack) stack_search(stack, 2) stack_search(stack, 6) } }
// เอาต์พุต
บทช่วยสอนนักพัฒนา Salesforce สำหรับผู้เริ่มต้น
ตอนนี้ให้เราย้ายไปที่ Heap Space
Heap Space ใน Java
หน่วยความจำถูกจัดสรรระหว่างการดำเนินการตามคำสั่งที่เขียนโดยโปรแกรมเมอร์ โปรดทราบว่าชื่อฮีปไม่มีส่วนเกี่ยวข้องกับโครงสร้างข้อมูลฮีป เรียกว่าฮีปเนื่องจากเป็นพื้นที่หน่วยความจำที่มีให้สำหรับโปรแกรมเมอร์ จัดสรร และ ยกเลิกการจัดสรร หากโปรแกรมเมอร์ไม่จัดการกับหน่วยความจำนี้ให้ดีอาจทำให้หน่วยความจำรั่วได้เกิดขึ้นในโปรแกรม
สิ่งที่ไม่แน่นอนใน java
คุณสมบัติที่สำคัญของ Java Heap Memory
- นอกเหนือจากสิ่งที่เราได้พูดถึงไปแล้วคุณสมบัติอื่น ๆ ของ heap space มีดังต่อไปนี้:
- เข้าถึงได้ผ่านเทคนิคการจัดการหน่วยความจำที่ซับซ้อนซึ่งรวมถึง เด็กรุ่นเก่า หรือ รุ่นอายุยืน และ รุ่นถาวร
- หากพื้นที่ฮีปเต็ม Java จะพ่น java.lang.OutOfMemoryError
- การเข้าถึงหน่วยความจำนี้ค่อนข้างช้ากว่าหน่วยความจำแบบสแต็ก
- หน่วยความจำนี้ตรงกันข้ามกับสแต็กจะไม่ถูกยกเลิกการจัดสรรโดยอัตโนมัติ มันต้องการ คนเก็บขยะ เพื่อเพิ่มวัตถุที่ไม่ได้ใช้เพื่อรักษาประสิทธิภาพของการใช้งานหน่วยความจำ
- ฮีปไม่เหมือนสแต็ก เธรดปลอดภัย และจำเป็นต้องได้รับการปกป้องโดยการซิงโครไนซ์โค้ดให้ถูกต้อง
ความแตกต่างระหว่าง Java Heap Space และ Stack Memory
จากคำอธิบายข้างต้นเราสามารถสรุปความแตกต่างระหว่าง กอง และ ซ้อนกัน หน่วยความจำ.
- กอง หน่วยความจำถูกใช้โดยทุกส่วนของแอ็พพลิเคชันในขณะที่หน่วยความจำสแต็กถูกใช้โดยเธรดการดำเนินการเดียวเท่านั้น
- เมื่อใดก็ตามที่สร้างวัตถุขึ้นมาวัตถุนั้นจะถูกเก็บไว้ใน Heap space เสมอและหน่วยความจำสแต็กจะมีการอ้างอิงถึงวัตถุนั้น หน่วยความจำสแต็กมีเฉพาะไฟล์ ตัวแปรดั้งเดิมในท้องถิ่น และ ตัวแปรอ้างอิง ไปยังวัตถุในพื้นที่กอง
- อ็อบเจ็กต์ที่เก็บไว้ในฮีปสามารถเข้าถึงได้ทั่วโลกในขณะที่เธรดอื่นไม่สามารถเข้าถึงหน่วยความจำสแต็กได้
- การจัดการหน่วยความจำในสแต็กทำได้ในรูปแบบ LIFO ในขณะที่หน่วยความจำ Heap มีความซับซ้อนมากกว่าเนื่องจากมีการใช้งานทั่วโลก หน่วยความจำฮีปแบ่งออกเป็น Young-Generation, Old-Generation ฯลฯ ดูรายละเอียดเพิ่มเติมได้ที่ Java Garbage Collection
- หน่วยความจำสแต็กคือ อายุสั้น ในขณะที่หน่วยความจำฮีปจะมีชีวิตตั้งแต่เริ่มต้นจนถึงสิ้นสุดการเรียกใช้แอปพลิเคชัน
- เราสามารถใช้ -XMX และ -XMS อ็อพชัน JVM เพื่อกำหนดขนาดเริ่มต้นและขนาดสูงสุดของหน่วยความจำฮีป เราสามารถใช้ -XSS เพื่อกำหนดขนาดหน่วยความจำสแต็ก
- เมื่อหน่วยความจำสแต็กเต็มรันไทม์ Java จะพ่น java.lang.StackOverFlowError ในขณะที่หน่วยความจำฮีปเต็มก็จะพ่นออกมา java.lang.OutOfMemoryError: Java Heap Spaceข้อผิดพลาด
- ขนาดหน่วยความจำแบบกองซ้อนน้อยมากเมื่อเทียบกับหน่วยความจำแบบฮีป เนื่องจากความเรียบง่ายในการจัดสรรหน่วยความจำ (LIFO), หน่วยความจำสแต็กนั้นเร็วมากเมื่อเทียบกับหน่วยความจำกอง
แผนภูมิเปรียบเทียบ
พารามิเตอร์ | ซ้อนกัน | กอง |
ขั้นพื้นฐาน | หน่วยความจำถูกจัดสรรในบล็อกที่ต่อเนื่องกัน | หน่วยความจำถูกจัดสรรแบบสุ่ม |
การจัดสรรและการจัดสรร | อัตโนมัติโดยคอมไพเลอร์ | คู่มือโดยโปรแกรมเมอร์ |
ค่าใช้จ่าย | น้อยกว่า | มากกว่า |
การนำไปใช้ | ยาก | ง่าย |
เวลาเข้าถึง | เร็วขึ้น | ช้าลง |
ปัญหาหลัก | การขาดแคลนหน่วยความจำ | การกระจายความทรงจำ |
ท้องถิ่นแห่งความแตกต่าง | ยอดเยี่ยม | เพียงพอ |
ความยืดหยุ่น | อัตราคงที่ | สามารถปรับขนาดได้ |
ด้วยเหตุนี้เราจึงสิ้นสุดบทช่วยสอน“ การจัดสรรหน่วยความจำใน Java” นี้ ฉันหวังว่าคุณจะเข้าใจแนวคิดและการนำไปใช้ผ่านตัวอย่างแบบเรียลไทม์
ตอนนี้คุณเข้าใจแล้วการจัดสรรหน่วยความจำใน Javaข้อมูลเบื้องต้นเกี่ยวกับบทความ“ การจัดสรรหน่วยความจำใน Java” ดูที่ไฟล์ โดย Edureka บริษัท การเรียนรู้ออนไลน์ที่เชื่อถือได้ซึ่งมีเครือข่ายผู้เรียนที่พึงพอใจมากกว่า 250,000 คนกระจายอยู่ทั่วโลก หลักสูตรการฝึกอบรมและการรับรอง Java J2EE และ SOA ของ Edureka ออกแบบมาสำหรับนักเรียนและผู้เชี่ยวชาญที่ต้องการเป็น Java Developer หลักสูตรนี้ออกแบบมาเพื่อให้คุณเริ่มต้นการเขียนโปรแกรม Java และฝึกอบรมแนวคิด Java ทั้งหลักและขั้นสูงพร้อมกับกรอบงาน Java ต่างๆเช่น Hibernate & ฤดูใบไม้ผลิ .
มีคำถามสำหรับเรา? ระบุไว้ในส่วนความคิดเห็นของบล็อก 'การจัดสรรหน่วยความจำใน Java' และเราจะติดต่อกลับโดยเร็วที่สุด