您好,登錄后才能下訂單哦!
java中的棧、堆、方法區是什么?針對這個問題,這篇文章給出了相對應的分析和解答,希望能幫助更多想解決這個問題的朋友找到更加簡單易行的辦法。
棧中保存基本數據類型的值和對象以及基礎數據的引用;堆中存儲的全部是對象,每個對象都包含一個與之對應的class的信息;方法區被所有的線程所共享,方法區包含所有的class和static變量。
1、Java棧
Java棧是一塊線程私有的空間,一個棧,一般由三部分組成:局部變量表、操作數據棧和幀數據區
局部變量表:用于報錯函數的參數及局部變量
操作數棧:主要保存計算過程的中間結果,同時作為計算過程中的變量臨時的存儲空間。
幀數據區:除了局部變量表和操作數據棧以外,棧還需要一些數據來支持常量池的解析,這里幀數據區保存著訪問常量池的指針,方便計程序訪問常量池,另外當函數返回或出現異常時賣虛擬機子必須有一個異常處理表,方便發送異常
的時候找到異常的代碼,因此異常處理表也是幀數據區的一部分。
2、Java 堆
堆內存用于存放由new創建的對象和數組。在堆中分配的內存,由java虛擬機自動垃圾回收器來管理。
在堆中產生了一個數組或者對象后,還可以在棧中定義一個特殊的變量,這個變量的取值等于數組或者對象在堆內存中的首地址,在棧中的這個特殊的變量就變成了數組或者對象的引用變量,以后就可以在程序中使用棧內存中的引用變量來訪問堆中的數組或者對象,引用變量相當于為數組或者對象起的一個別名,或者代號根據垃圾回收機制的不同,Java堆有可能擁有不同的結構,最為常見的就是將整個Java堆分為
新生代和老年代。其中新聲帶存放新生的對象或者年齡不大的對象,老年代則存放老年對象。
新生代分為den區、s0區、s1區,s0和s1也被稱為from和to區域,他們是兩塊大小相等并且可以互相角色的空間。絕大多數情況下,對象首先分配在eden區,在新生代回收后,如果對象還存活,則進入s0或s1區,之后每經過一次新生代回收,如果對象存活則它的年齡就加1,對象達到一定的年齡后,則進入老年代。
3、Java方法區
Java方法區和堆一樣,方法區是一塊所有線程共享的內存區域,他保存系統的類信息。比如類的字段、方法、常量池等。方法區的大小決定系統可以保存多少個類。如果系統定義太多的類,導致方法區溢出。虛擬機同樣會拋出內存溢出的錯誤。方法區可以理解為永久區。
關于java中的棧、堆、方法區就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。