JAVA中的堆和棧

##java的內存機制 Java 把內存劃分紅兩種:一種是棧內存,另外一種是堆內存。java

| |Heap(堆) |Stack(棧) | |------------------|---------------|---------------- -------------------------------------------------| |JVM中的功能|內存數據區| 內存指令區 | |存儲數據 |對象實例 | 基本數據類型, 指令代碼,常量,對象的引用地址 | ###堆中存儲數據 堆內存用來存放由 new 建立的對象和數組。 保存對象實例,其實是保存對象實例的屬性值,屬性的類型和對象自己的類型標記等,並不保存對象的方法(方法是指令,保存在stack中)。數組

在堆中分配的內存,由 Java 虛擬機的自動垃圾回收器來管理。 對象實例在heap中分配好之後,須要在棧stack中保存一個4字節的heap內存地址,用來定位該對象實例在heap中的位置,便於找到該對象實例。棧中的這個內存地址就成了數組或對象的引用變量,之後就能夠在程序中使用棧中的引用變量來訪問堆中的數組或者對象,引用變量就至關因而爲數組或者對象起的一個名稱。引用變量是普通的變量,定義時在棧中分配,引用變量在程序運行到其做用域以外後被釋放。而數組和對象自己在堆中分配,即便程序運行到使用 new 產生數組或者對象的語句所在的代碼塊以外,數組和對象自己佔據的內存不會被釋放,數組和對象在沒有引用變量指向它的時候,才變爲垃圾,不能在被使用,但仍然佔據內存空間不放,在隨後的一個不肯定的時間被垃圾回收器收走(釋放掉)。 ###棧中存儲數據 在函數中定義的一些基本類型的變量和對象的引用變量都是在函數的棧內存中分配,當在一段代碼塊定義一個變量時,Java 就在棧中爲這個變量分配內存空間。當超過變量的做用域後,Java 會自動釋放掉爲該變量分配的內存空間,該內存空間能夠當即被另做它用。函數

基本數據類型包括byte、int、char、long、float、double、boolean和short。線程

函數方法屬於指令.對象

網上普遍流傳的「Java堆和棧的區別」裏面對堆和棧的介紹:"Java 的堆是一個運行時數據區,類的(對象從中分配空間。這些對象經過new、newarray、anewarray和multianewarray等指令創建,它們不須要程序代碼來顯式的釋放。堆是由垃圾回收來負責的,堆的優點是能夠動態地分配內存大小,生存期也沒必要事先告訴編譯器,由於它是在運行時動態分配內存的,Java的垃圾收集器會自動收走這些再也不使用的數據。但缺點是,因爲要在運行時動態分配內存,存取速度較慢。" 「棧的優點是,存取速度比堆要快,僅次於寄存器,棧數據能夠共享。但缺點是,存在棧中的數據大小與生存期必須是肯定的,缺少靈活性。棧中主要存放一些基本類型的變量(,int, short, long, byte, float, double, boolean, char)和對象句柄。 」內存

###獨有仍是共享 棧內存歸屬於單個線程,每一個線程都會有一個棧內存,其存儲的變量只能在其所屬線程中可見,即棧內存能夠理解成線程的私有內存。作用域

而堆內存中的對象對全部線程可見。堆內存中的對象能夠被全部線程訪問。編譯器

相關文章
相關標籤/搜索