Memory Allocation ใน Java คืออะไร? หน่วยความจำกองและกอง



บทความนี้อ้างอิงจาก 'การจัดสรรหน่วยความจำใน Java' จะช่วยให้คุณมีความรู้โดยละเอียดเกี่ยวกับการจัดสรรหน่วยความจำพร้อมกับโครงสร้างข้อมูล Stack และ Heap

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

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 สำหรับผู้เริ่มต้น

memory-allocation-in-java

ตอนนี้ให้เราย้ายไปที่ 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' และเราจะติดต่อกลับโดยเร็วที่สุด