為啥記憶體需要堆?

2021-09-17 07:25:23 字數 726 閱讀 2548

翻譯自:

我們需要知道的最重要的事情是棧的功能和堆的功能這兩者是有顯著區別的。

在乙個典型的程式語言中,在乙個方法呼叫的時候,乙個「棧幀」就會被建立出來。隨後,所有的該方法的本地變數就會在這個棧幀的範圍中被建立。然後,當這個方法返回的時候,該方法的棧幀就被「刪除」了。這些都是「自動」的。高層開發人員不需要在方法呼叫的時候去建立棧幀,也不需要在本地變數建立或使用的時候把它們放到棧幀上,也不需要在方法返回的時候刪除棧幀。底層的執行時系統會提供上述所有的功能。

但是,從根本上來說,棧還有個大問題:變數(或物件)等在棧幀上生成,但是所有的變數和物件也會隨著方法的返回一起消失!所以,如果你想要使乙個變數在多個方法中共享,那麼,棧不像是乙個能夠建立該變數的好的地方。

也就是說,我們需要有乙個地方能夠建立跨越方法呼叫的變數。這個地方顯然不是在棧中。我們把這個可以用來隨意放資料的記憶體堆叫做什麼呢?hmm!就叫堆好了,大概我們的計算機大佬們就是這樣決定的。

另外乙個非常重要的點是你在堆上可以「隨意地」分配,只要堆還有空間,記憶體分配就會成功。從另乙個角度說,你在堆上分配的所有記憶體可以在任意時間被釋放掉!而棧不會給你這個「在棧上釋放物件的」自由因為這可能導致棧執行混亂掉。

記憶體中的棧用資料結構中的棧來實現剛好是個巧合,但是記憶體的堆和資料結構中的堆沒有任何關係。在這種情況下,我感覺我們只需要把堆看成記憶體的中的「一堆」就好了…意味著一塊大的,無條理的記憶體區域,我們可以在這塊記憶體區域上儲存資料,也可以刪除資料。

重寫equals為啥需要重寫hashCode

以前一直記得重寫equals要把hashcode也要重寫了,但是一直也是沒有搞明白,最近在看一些東西,覺得有必要記錄一下。equals是object類的方法,這個方法的作用是比較兩個物件是否相等的,可能有人會問了,使用 號不就可以比較了,為啥非得使用equals方法呢。假設你有乙個student類,...

RPC 中為啥需要健康檢測

因為有了集群,每次傳送請求前,rpc 框架會根據路由和負載均衡演算法選擇乙個具體的 ip 位址。為了保證請求成功,就需要確保每次選擇出來的 ip 對應的連線是健康的。但是呼叫方各個服務集群節點之間的網路狀態是瞬息萬變的,兩者之間可能會出現閃斷或者網路裝置損壞等情況,那麼怎麼保證連線一定是可用的呢?終...

堆記憶體 棧記憶體

從堆和棧的功能和作用來通俗的比較,堆主要用來存放物件的,棧主要是用來執行程式的.而這種不同又主要是由於堆和棧的特點決定的 在程式設計中,例如c c 中,所有的方法呼叫都是通過棧來進行的,所有的區域性變數,形式引數都是從棧中分配記憶體空間的。實際上也不是什麼分配,只是從棧頂向上用就行,就好像工廠中的傳...