Java中堆記憶體和棧記憶體的區別
JVM將記憶體空間分為兩部分:棧和堆。棧主要用於儲存方法執行順序和區域性變數。
棧總是按照後進先出 (LIFO) 的順序儲存塊,而堆記憶體使用動態分配來分配和釋放記憶體塊。
分配給堆的記憶體會在以下事件之一發生時釋放:
- 程式終止
- 記憶體釋放
相反,分配給棧的記憶體會在函式返回時釋放。以下是它們的區別。
| 序號 | 關鍵點 | 棧 | 堆記憶體 |
|---|---|---|---|
| 1 | 基本 | 棧記憶體用於儲存生命週期很短的項,例如區域性變數、物件的引用變數 | 堆記憶體用於儲存物件和JRE類。 |
| 2 | 排序 | 棧總是按照後進先出 (LIFO) 的順序保留 | 堆記憶體是動態分配的,沒有固定的記憶體塊分配和釋放模式 |
| 3 | 大小 | 可以使用JVM引數 -XSS 增加棧記憶體大小 | 可以使用JVM選項 -Xms 和 -Xmx 增加或減少堆記憶體大小 |
| 4 | 可見性 | 變數僅對擁有它的執行緒可見 | 對所有執行緒可見 |
| 5 | 異常 | JVM將丟擲java.lang.StackOverFlowError | JVM將丟擲java.lang.OutOfMemoryError |
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP