java堆指的是java虛擬機(jī)管理的一塊內(nèi)存,這塊內(nèi)存可以說是大的一塊,同時(shí)它也是被所有的線程共享的一塊區(qū)域,它的創(chuàng)建一般是在虛擬機(jī)啟動(dòng)的時(shí)候。java堆的作用就是存儲(chǔ)對(duì)象實(shí)例,差不多所有的對(duì)象實(shí)例都是在這里進(jìn)行內(nèi)存分配的?,F(xiàn)在有很多的朋友對(duì)于java堆的空間結(jié)構(gòu)比較感興趣,那么java堆空間結(jié)構(gòu)是怎樣的?java對(duì)象在內(nèi)存中是怎樣分配的呢?下面成都網(wǎng)站建設(shè)就給朋友們?cè)敿?xì)的來(lái)分析一下。
目前創(chuàng)新互聯(lián)建站已為超過千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、網(wǎng)站托管、服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計(jì)、賓陽(yáng)網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。java堆空間結(jié)構(gòu)是怎樣的?絕大部分 Java 程序員應(yīng)該都見過 "java.lang.OutOfMemoryError: PermGen space" 這個(gè)異常。這里的 "PermGen space"其實(shí)指的就是方法區(qū)。不過方法區(qū)和“PermGen space”又有著本質(zhì)的區(qū)別。前者是 JVM 的規(guī)范,而后者則是 JVM 規(guī)范的一種實(shí)現(xiàn),并且只有 HotSpot 才有 “PermGen space”,而對(duì)于其他類型的虛擬機(jī),如 JRockit(Oracle)、J9(IBM) 并沒有“PermGen space”。由于方法區(qū)主要存儲(chǔ)類的相關(guān)信息,所以對(duì)于動(dòng)態(tài)生成類的情況比較容易出現(xiàn)永久代的內(nèi)存溢出成都網(wǎng)站制作。最典型的場(chǎng)景就是,在 jsp 頁(yè)面比較多的情況,容易出現(xiàn)永久代內(nèi)存溢出。
方法區(qū)與Java堆一樣,是各個(gè)線程共享的內(nèi)存區(qū)域,它用于存儲(chǔ)已被Java虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼等數(shù)據(jù)。然而這種實(shí)現(xiàn)方式是沒有效率的,假若一個(gè)類有很多方法,那么每個(gè)對(duì)象就要持有20個(gè)指針,相應(yīng)的,每個(gè)對(duì)象都需要20個(gè)指針的內(nèi)存空間,這會(huì)導(dǎo)致創(chuàng)建對(duì)象變慢,所占空間更大。
程序計(jì)數(shù)器:是一個(gè)數(shù)據(jù)結(jié)構(gòu),用于保存當(dāng)前正常執(zhí)行的程序的內(nèi)存地址。Java虛擬機(jī)的多線程就是通過線程輪流切換并分配處理器時(shí)間來(lái)實(shí)現(xiàn)的,為了線程切換后能恢復(fù)到正確的位置,每條線程都需要一個(gè)獨(dú)立的程序計(jì)數(shù)器,互不影響,該區(qū)域?yàn)椤熬€程私有”。Java虛擬機(jī)棧:線程私有的,與線程生命周期相同,用于存儲(chǔ)局部變量表,操作棧,方法返回值。局部變量表放著基本數(shù)據(jù)類型,還有對(duì)象的引用。
本地方法棧:跟虛擬機(jī)棧很像,不過它是為虛擬機(jī)使用到的Native方法服務(wù)。方法區(qū):各個(gè)線程共享的區(qū)域,儲(chǔ)存虛擬機(jī)加載的類信息,常量,靜態(tài)變量,編譯后的代碼。拿HotSpot 虛擬機(jī)來(lái)說,在 JDK1.7的時(shí)候,方法區(qū)被稱作為永久代, 從JDK1.8開始,Metaspace (元空間)也就是我們所謂的方法區(qū)!
運(yùn)行時(shí)常量池:代表運(yùn)行時(shí)每個(gè)class文件中的常量表。包括幾種常量:編譯時(shí)的數(shù)字常量、方法或者域的引用。特別注意其中Java 堆和方法區(qū)是 線程共享的。其他都是 線程私有的。
java堆空間結(jié)構(gòu)是怎樣的?以上就給大家介紹了關(guān)于java堆空間結(jié)構(gòu)的問題,對(duì)于java堆空間結(jié)構(gòu),我們?nèi)绻容^感興趣的話,就可以認(rèn)真的了解下,同時(shí),我們還可以了解下java對(duì)象在內(nèi)存中的分配情況,這個(gè)問題也是非常有意義的,這樣我們對(duì)java堆就有了更為深刻的認(rèn)識(shí),如果還有疑問的話,可以咨詢創(chuàng)新互聯(lián)。