java中,堆的執行速度為什麼比棧慢?

時間 2021-05-30 19:53:13

1樓:Jim Liu

現在CPU的架構都是多級快取,一般至少要通過一級快取,二級快取,CPU核心速度才能和 「緩慢的」 記憶體去匹配工作,快取是CPU中最昂貴的部分,商業市場上CPU高低端定價差別的主要因素。

堆疊實現可以是CPU指令級別就支援的操作,和CPU體系結構相關,快取命中率非常高,我記得乙個程序的預設堆疊空間Linux下預設才20M吧, 堆上分配記憶體過程就複雜得多了,通過一定演算法控制的,和作業系統記憶體管理機制有關,比如Windows下和Linux是有區別的,用到2G也是可能的。

你可以這樣比喻更容易理解,每天早上你都習慣背誦新單詞,那麼在這天裡面的新單詞命中一級快取,訪問效率很高,在你一天的記憶「堆疊」中。 而兩個月前的單詞你可能記不清了,要開啟記事本看看,在二級快取中。兩年前的單詞忘記了,要查字典,在記憶體「堆」中。

2樓:

堆裡存放的是具體的物件,棧裡放的是物件的控制代碼。

你覺得是移除掉倉庫裡的乙個具體物件快呢,還是擦掉倉庫清單薄上的一條記錄快呢

3樓:裝飾你的風景

一般棧的記憶體都是一片連續的,定義乙個,再定義乙個。而堆裡邊的東西都是new出來的,然後傳來傳去的前後操作記憶體不連續,這對CPU的快取記憶體不友好,所以慢。

4樓:

棧記憶體清除,只要把指標移到棧底就可以了,不用管記憶體的分配和碎片。

而堆要考慮道碎片和清理,棧比堆是快很多,但是棧空間有限,略微大點都不能用

5樓:RednaxelaFX

原題引用的:看到很多書上寫棧的執行速度快,處於堆和暫存器之間,所以用來執行程式;堆得速度慢,所以用來存放物件。必須是霧很大啊。

通常的環境下,記憶體管理意義的堆(heap)和棧(stack)的訪問速度一樣。都是普通記憶體。

得定義「執行」是指什麼方面的動作,是分配?釋放?還是訪問?

晶元的執行速度是由什麼決定的?

石大小生 1.晶元的速度等級決定於晶元內部的門延時和線延時,這兩個因bai素又決定於電晶體的長度L和容值C,這兩個數值的差異最終決定於晶元的生產工藝。怎樣的工藝導致了這一差異,我還沒找到答案。2.在晶元生產過程中,有乙個階段叫做speed binning。就是採用一定的方法 按照一組標準對生產出來的...

Java中物件為什麼存放在堆記憶體?

漂風 首先,堆的資料結構是乙個特殊線性表,訪問資料的原則是先進後出。棧的資料結構通常是乙個完全二叉樹,每乙個節點儲存乙個值,整棵樹都是經過排序的。棧的記憶體空間相當於一棟均勻分層的大樓,每一層都是固定的面積,想要繼續擴建,只能向上建築樓層。因此,棧的每一塊記憶體空間都是固定大小,儲存內容的能力很受侷...

為什麼說 JAVA中的ThreadLocal是最簡單的非阻塞同步 ?

Joash ThreadLocal是存在於Thread類中的資料結構。它用於遮蔽自己的資料,防止其他執行緒訪問。然而同步問題所涉及的不僅僅是乙個執行緒或者是程序。同步的出現必定涉及到了執行緒或程序間的共享資源。對比兩個概念真的沒有發現有什麼共同之處。multithreading ThreadLoca...