JAVA記憶體管理之堆記憶體和棧記憶體

來源:互聯網
上載者:User

標籤:虛擬   缺點   棧幀   定義   分配   執行   java   類型   ges   

我們常常做的是將Java記憶體地區簡單的劃分為兩種:堆記憶體和棧記憶體。這種劃分比較粗粒度,這種劃分是著眼於我們最關注的、與對象記憶體配置密切相關的兩類記憶體域。其中棧記憶體指的是虛擬機器棧,堆記憶體指的是java堆。

1.棧記憶體,即虛擬機器棧。每個方法被執行的時候都會同時建立一個棧幀,用來儲存局部變數,操作棧,動態連結,方法出口等資訊。局部變數包括各種基本類型的變數和對象的引用變數都是在方法的棧記憶體中分配。其中,64位長度的long和double類型的資料佔用2個局部變數的空間,其他資料類型只佔用1個。局部變數所需要的記憶體空間是在編譯期間完成的,當進入一個方法時候,這個方法所需的局部變數空間已經確定,在方法運行期間不會改變。當在一段代碼塊中定義一個變數時,java就在棧中為這個變數分配記憶體空間,當超過變數的範圍後,java會自動釋放掉為該變數分配的記憶體空間,該記憶體空間可以立刻被另作他用。當線程請求的棧深度大於虛擬機器所允許的深度,則拋出StackOverflowError異常。當虛擬機器棧無法擴充時候則拋出OutOfMemoryError異常。出現這種情況的解決辦法具體參見java調優。2.堆記憶體,在虛擬機器啟動時建立。堆記憶體的唯一目的就是建立對象執行個體,所有的對象執行個體和數組都要在堆上分配。堆是由記憶體回收來負責的,因此也叫做“GC堆”,記憶體回收採用分代演算法,堆由此分為新生代和老年代。堆的優勢是可以動態地分配記憶體大小,生存期也不必事先告訴編譯器,因為它是在運行時動態分配記憶體的,Java的垃圾收集器會自動收走這些不再使用的資料。但缺點是,由於要在運行時動態分配記憶體,存取速度較慢。當堆記憶體因為滿了無法擴充時就會拋出java.lang.OutOfMemoryError: Java heap space異常。出現這種情況的解決辦法具體參見java調優。    其實,Java記憶體不只局限於以上兩種,還有:    1.程式計數器,(中的線程pc寄存器)記錄當前線程所執行的位元組碼的行號。    2.本地方法棧,與上面的虛擬機器棧類似,只不過虛擬機器棧是為java方法服務,而本地方法棧是用來為native方法服務。    3.方法區,用於存放已被虛擬機器載入的類資訊、常量、靜態變數。記憶體回收在這個地區出現的幾率少。在這個地區的回收就是類型的卸載。只有當載入該類型的類載入器執行個體(非類載入器類型)為unreachable狀態時,當前被載入的類型才被卸載。所以一般不會被卸載。    4.運行時常量池,存放編譯期產生的各種字面量和符號引用,這部分內容將在類載入後存放在方法區的運行時常量池中。該地區不會被回收,例如String s="abc";s="xyz";s=null;"abc"和"xyz"將一直存在於在字串池中,這就是java記憶體泄露的原因之一。 摘自 http://blog.sina.com.cn/s/blog_6cad92b701019r8o.html

JAVA記憶體管理之堆記憶體和棧記憶體

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.