Java中的儲存空間類型

來源:互聯網
上載者:User

在Thinking in java裡,列舉了Java的六種儲存類型
1.寄存器
編寫過組譯工具的應該對寄存器非常熟悉,那時候用的ax,bx,cx,dx等等。寄存器在CPU裡面,所以速度特別快,但是數量非常有限。在java中無法直接和寄存器打交道,不過在c中是可以聲明寄存器變數的。

2.棧空間
寫過彙編的肯定感到非常親切,在組譯工具裡不就是壓棧和出棧嗎?有一個指標控制棧空間,分配空間是棧指標上移,就是push操作,釋放空間指標下移,就是pop操作。當然C和C++也主要是通過棧分配空間的。因為只要壓棧和出棧,所以速度特別快。java中的對象引用是通過棧分配的,而java對象不是通過棧分配的,這也是java效率相對差一些的原因吧。通過棧分配空間有一個限制就是必須在編譯時間確定空間大小,也就是程式運行前就應該可以知道運行時記憶體的情況。比如mov ax,4這條指令佔用多少個位元組在編譯時間是確定的。

3.堆空間
就是一個大的記憶體塊,需要的時候就申請分配,java中的對象都是在堆中非配的。但是堆空間的回收是比較麻煩的,所以JVM的回收演算法都比較複雜。但是如果堆空間比較大,也就是記憶體沒有面臨用完的話,JVM一般不會啟動記憶體回收行程。這種情況下堆的效率和棧應該差不多,只是堆沒有回收空間而已。如果要不時的啟動GC的話,可以想象效率會極其低下。

4.靜態儲存區
聲明為static的變數因為他們一直存在(整個程式運行過程中),所以他們被儲存在一個靜態儲存區。

5.常量儲存區
聲明為final static的為常量,可以儲存在常量儲存區,還有String類型的對象都是常量,系統維護了一個String常量池。

6.其他儲存
非RAM儲存空間,主要就是磁帶,磁碟等等。

這裡最關鍵的應該是棧和堆,棧應該是應用最廣泛的,在彙編中函數調用的時候一般是這樣的過程:
1.壓棧(保護現場)
2.進入方法調用
3.出棧(恢複現場)
這裡只是簡單的描述,上面的過程可能會有好多嵌套,不過大致過程就是這樣,在其他語言其實也是一樣的。 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.