JVM ได้แบ่งพื้นที่หน่วยความจำระหว่างสองส่วนคือ Stack และอีกส่วนหนึ่งคือ Heap space พื้นที่สแต็กส่วนใหญ่จะใช้สำหรับจัดเก็บลำดับการดำเนินการเมธอดและตัวแปรโลคัล
สแต็คบล็อกที่เก็บไว้เสมอในลำดับ LIFO ในขณะที่หน่วยความจำฮีปใช้การจัดสรรแบบไดนามิกสำหรับการจัดสรรและจัดสรรบล็อกหน่วยความจำใหม่
หน่วยความจำที่จัดสรรให้กับฮีปจะคงอยู่จนกว่าจะเกิดเหตุการณ์ใดเหตุการณ์หนึ่งต่อไปนี้ :
- โปรแกรมสิ้นสุด
- ไม่มีหน่วยความจำ
ในทางตรงกันข้าม หน่วยความจำที่จัดสรรให้กับสแต็กจะคงอยู่จนกว่าฟังก์ชันจะส่งคืน ด้านล่างนี้คือข้อแตกต่าง
ซีเนียร์ เลขที่ | คีย์ | กอง | Heap Memory |
---|---|---|---|
1 | พื้นฐาน | หน่วยความจำสแต็กใช้เพื่อจัดเก็บรายการที่มีอายุสั้นมาก เช่น ตัวแปรในเครื่อง ตัวแปรอ้างอิงของอ็อบเจ็กต์ | หน่วยความจำฮีปถูกจัดสรรเพื่อจัดเก็บอ็อบเจ็กต์และคลาส JRE |
2 | การสั่งซื้อ | กองจะถูกสงวนไว้ในลำดับ LIFO (เข้าก่อนออกก่อน) เสมอ | หน่วยความจำฮีปคือการจัดสรรแบบไดนามิก ไม่มีรูปแบบตายตัวสำหรับการจัดสรรและจัดสรรบล็อกในหน่วยความจำ |
3 | ขนาด | เราสามารถเพิ่มขนาดหน่วยความจำสแต็กโดยใช้พารามิเตอร์ JVM -XSS | เราสามารถเพิ่มหรือลดขนาดหน่วยความจำฮีพได้โดยใช้ตัวเลือก JVM -Xms และ -Xmx |
4 | การมองเห็น | ตัวแปรมองเห็นได้เฉพาะกับเจ้าของเธรดเท่านั้น | ปรากฏแก่เธรดทั้งหมด |
5 | ข้อยกเว้น | JVM จะโยน java.lang.StackOverFlowError | JVM จะโยน java.lang.OutOfMemoryError |