關於內存可以說是Java中的重要概念,而棧和堆又是內存中的兩個重要部分。怎樣理解棧和堆?棧可以理解為內存中一片連續的區域,而堆可以理解為內存中一片分散的區域。可以說,棧是用來運行程序的區域,當在棧裡應用一個值的時候,這個值就會指向堆中的一個位置。其實可以理解為一種函數關係。在進一步理解堆和棧的關係,則要先理解一下Java虛擬機。
在學Java的過程中,有些人會寫代碼,但對數據的來源並不清楚,代碼是怎樣運行和實現的,和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的朋友有所幫助。