java 堆與棧

棧(stack):主要保存基本類型(或者叫內置類型)(char、byte、short、int、long、float、double、boolean)和對象的引用,數據可以共享,速度僅次於寄存器(register),快於堆。

堆(heap):用於存放由new創建的對象和數組

靜態、常量區(data segment):存放的是靜態變量(類變量)或是常量。

方法區(codesegment):存放的是對象的方法。因此即使new出多個對象也是隻是存在一個方法。


棧的優勢:存取速度比堆要快,僅次於直接位於CPU中的寄存器。但缺點是,存在棧中的數據大小與生存期必須是確定的,缺乏靈活性。另外,棧數據可以共享。

堆的優勢:可以動態地分配內存大小,生存期也不必事先告訴編譯器,Java的垃圾收集器會自動收走這些不再使用的數據。但缺點是,由於要在運行時動態分配內存,存取速度較慢。


當在一段代碼塊定義一個變量時,Java就在棧中爲這個變量分配內存空間,當超過變量的作用域後,Java會自動釋放掉爲該變量所分配的內存空間,該內存空間可以立即被另作他用。

在堆中分配的內存,由Java虛擬機的自動垃圾回收器來管理。


A a = new A(); A中含有一個work方法,2個成員變量a,b。那麼對應的內存分配爲
則 a是分配在棧內存中。裏面存放了一個指向堆內存中存放的new A()的地址。
new A()會導致在堆內存中分配一塊空間,該內存中的A對象同時會含有a和b。
work()方法會在codesegment區中分配內存。
如果此時 A b = a;則表示把a的值複製給b,即b的值爲a中保存的地址
發佈了287 篇原創文章 · 獲贊 6 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章