如何準確理解Java中的堆與棧

關於內存能夠說是Java中的重要概念,而棧和堆又是內存中的兩個重要部分。怎樣理解棧和堆?棧能夠理解爲內存中一片連續的區域,而堆能夠理解爲內存中一片分散的區域。能夠說,棧是用來運行程序的區域,當在棧裏應用一個值的時候,這個值就會指向堆中的一個位置。其實能夠理解爲一種函數關係。在進一步理解堆和棧的關係,則要先理解一下Java虛擬機。java

在學Java的過程當中,有些人會寫代碼,但對數據的來源並不清楚,代碼是怎樣運行和實現的,和JVM也有着密切的關係。jvm

一個Java程序須要在Java虛擬機(JVM)上運行才能得以實現,當java程序啓動時,java虛擬機也會自動地開啓,當java程序的全部線程都結束的時候,天然而然的,載體也會中止工做。函數

jvm在啓動時,會開啓虛擬機自身的線程,例如垃圾回收線程,還有java程序的線程,建立的線程名,同時建立對象和變量,這些都會放在JVM的棧中,而線程對象字符串,new的對象,變量,都會放在堆中;最後,變量的值,則會放在方法中,方法區和堆都是共享的,經過以上的敘述,就能夠看出一些JVM的運行機制。線程

若是從數據的調用方面和對象的建立方面來講的話,堆,棧,方法區,是一個總體存在的東西,例如,一個String b=new String(「test」); 我如今new了一個對象b這個對象名放在棧中,b這個對象值(對象字符串)放在堆中,"test"就會放到方法區中,這樣的分工機制有效提高了程序運行的速度。對象

因而可知,堆是java應用程序最密切的內存空間。能夠說全部的對象都存在堆中。並且堆的管理是自動化的,經過GC回收機制,垃圾對象會自動清理,不須要顯式釋放。
由於垃圾回收機制各不相同,因此java堆可能有不一樣的結構。最多見的是將整個java堆分爲新生代和老年代。尚學堂陳老師指出,老年代的數據最終要被消除,新生代存放新對象或者年齡不大的對象,老年代存放老年對象。新生代有可能分爲eden區、s0區和s1區,s0區和s1區也被稱之爲 from 到to區域。
通常狀況下,對象首先被分配在eden區,再一次新生代回收後,若是對象還存在,則會進入s0或者s1,而當對象年齡達到必定條件後,就會老齡化進入老年代。內存

以上就是對Java中堆與棧的理解,但願對正在學Java的朋友有所幫助。
 字符串

相關文章
相關標籤/搜索