java堆空間結構是怎樣的?java對象在內存中是怎樣分配的?
java堆指的是java虛擬機管理的一塊內存,這塊內存可以說是最大的一塊,同時它也是被所有的線程共享的一塊區(qū)域,它的創(chuàng)建一般是在虛擬機啟動的時候。java堆的作用就是存儲對象實例,差不多所有的對象實例都是在這里進行內存分配的?,F(xiàn)在有很多的朋友對于java堆的空間結構比較感興趣,那么java堆空間結構是怎樣的?java對象在內存中是怎樣分配的呢?下面新網就給朋友們詳細的來分析一下。
Java堆可以細分為:新生代和老年代;在細致一點的有Eden空間、From Survivor空間、To Survivor空間等。
這樣劃分的目的是為了使 JVM 能夠更好的管理堆內存中的對象,可以根據跟個年代的特點采用最適當的收集算法。在新生代中,每次垃圾收集時都發(fā)現(xiàn)有大批的對象死去,只有少量存活,那就選用復制算法,只需要付出少量存活對象的復制成本就可以完成收集。而老年代中因為對象存活率高、沒有額外空間對它進行分配擔保,就必須使用"標記---整理"算法來進行回收。
絕大部分 Java 程序員應該都見過 "java.lang.OutOfMemoryError: PermGen space" 這個異常。這里的 "PermGen space"其實指的就是方法區(qū)。不過方法區(qū)和“PermGen space”又有著本質的區(qū)別。前者是 JVM 的規(guī)范,而后者則是 JVM 規(guī)范的一種實現(xiàn),并且只有 HotSpot 才有 “PermGen space”,而對于其他類型的虛擬機,如 JRockit(Oracle)、J9(IBM) 并沒有“PermGen space”。由于方法區(qū)主要存儲類的相關信息,所以對于動態(tài)生成類的情況比較容易出現(xiàn)永久代的內存溢出。最典型的場景就是,在 jsp 頁面比較多的情況,容易出現(xiàn)永久代內存溢出。
在Java8中移除了永生代,取而代之是元空間(Metaspace) 移除了永久代(PermGen),替換為元空間(Metaspace)
永久代中的 class metadata 轉移到了 native memory(本地內存,而不是虛擬機);
永久代中的 interned Strings 和 class static variables 轉移到了 Java heap;
永久代參數 (PermSize MaxPermSize) ->。
Java 對象在堆中的內存結構
我們知道,函數每次被調用時,在內存中都有自己的活動記錄(activation record),稱為??臻g(stack). Java 的方法在調用時在 JVM 棧中為其分配一個棧幀(Java??臻g的一個片段),可以稱之為方法棧. 原則上,所有對象都在堆空間(Heap)中分配。
java對象在內存中是怎樣分配的呢?
一旦對象在堆中分配了空間,那本質上就是一系列的字節(jié),那么如何找到對象中某個特定的屬性域呢? 編譯器通過一個內部表來保存每個域的偏移量。
子類對象和父類對象擁有同樣的內存分布,當然,子類對象需要更多的空間來存放新的屬性域。
這種分配方式的好處在于 Base類型的指針 如果指向了子類Derived的對象,依然在開頭的地方"看見"Base對象。
因此, 子類對象(Derived)采用 父類引用(Base) 來進行的操作 保證是安全的,因此在運行時不需要動態(tài)地檢查 Base 引用的實際類型。
然而這種實現(xiàn)方式是沒有效率的,假若一個類有很多方法,那么每個對象就要持有20個指針,相應的,每個對象都需要20個指針的內存空間,這會導致創(chuàng)建對象變慢,所占空間更大。
Java虛擬機棧:線程私有的,與線程生命周期相同,用于存儲局部變量表,操作棧,方法返回值。局部變量表放著基本數據類型,還有對象的引用。
Java堆:所有線程共享的一塊內存區(qū)域,對象實例幾乎都在這分配內存。
方法區(qū):各個線程共享的區(qū)域,儲存虛擬機加載的類信息,常量,靜態(tài)變量,編譯后的代碼。拿HotSpot 虛擬機來說,在 JDK1.7的時候,方法區(qū)被稱作為永久代, 從JDK1.8開始,Metaspace (元空間)也就是我們所謂的方法區(qū)!
特別注意其中Java 堆和方法區(qū)是 線程共享的。其他都是 線程私有的。
聲明:免責聲明:本文內容由互聯(lián)網用戶自發(fā)貢獻自行上傳,本網站不擁有所有權,也不承認相關法律責任。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內容,請發(fā)
送郵件至:operations@xinnet.com進行舉報,并提供相關證據,一經查實,本站將立刻刪除涉嫌侵權內容。本站原創(chuàng)內容未經允許不得轉載,或轉載時
需注明出處:新網idc知識百科