創(chuàng)新互聯(lián)www.cdcxhl.cn八線動態(tài)BGP香港云服務(wù)器提供商,新人活動買多久送多久,劃算不套路!
創(chuàng)新互聯(lián)建站始終致力于在企業(yè)網(wǎng)站建設(shè)領(lǐng)域發(fā)展。秉承“創(chuàng)新、求實(shí)、誠信、拼搏”的企業(yè)精神,致力為企業(yè)提供全面的網(wǎng)絡(luò)宣傳與技術(shù)應(yīng)用整體策劃方案,為企業(yè)提供包括“網(wǎng)站建設(shè)、響應(yīng)式網(wǎng)站建設(shè)、手機(jī)網(wǎng)站建設(shè)、微信網(wǎng)站建設(shè)、小程序制作、商城網(wǎng)站建設(shè)、平臺網(wǎng)站建設(shè)秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。今天就跟大家聊聊有關(guān)如何劃分JVM內(nèi)存區(qū)域,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
1、內(nèi)存區(qū)域的劃分
通常可以把 JVM 內(nèi)存區(qū)域分為下面幾個方面,其中,有的區(qū)域是以線程為單位,而有的區(qū)域則是整個 JVM 進(jìn)程唯一的。
(1)程序計(jì)數(shù)器。在 JVM 規(guī)范中,每個線程都有它自己的程序計(jì)數(shù)器,并且任何時間一個線程都只有一個方法在執(zhí)行,也就是所謂的當(dāng)前方法。程序計(jì)數(shù)器會存儲當(dāng)前線程正在執(zhí)行的 Java 方法的 JVM 指令地址;或者,如果是在執(zhí)行本地方法,則是未指定值。
(2)Java 虛擬機(jī),早期也叫 Java 棧。每個線程在創(chuàng)建時都會創(chuàng)建一個虛擬機(jī)棧,其內(nèi)部保存一個個的棧幀,對應(yīng)著一次次的 Java 方法調(diào)用。前面談程序計(jì)數(shù)器時,提到了當(dāng)前方法;同理,在一個時間點(diǎn),對應(yīng)的只會有一個活動的棧幀,通常叫做當(dāng)前幀,方法所在的類叫做當(dāng)前類。如果在該方法中調(diào)用了其他方法,對應(yīng)的新的棧幀會被創(chuàng)建出來,成為新的當(dāng)前幀,一直到它返回結(jié)果或者執(zhí)行結(jié)束。JVM 直接對 Java 棧的操作只有兩個,就是對棧幀的壓棧和出棧。棧幀中存儲著局部變量表,操作數(shù)棧,動態(tài)鏈接,方法正常退出或者異常退出的定義等。
(3)堆,它是 Java 內(nèi)存管理的核心區(qū)域,用來放置 Java 對象實(shí)例,幾乎所有創(chuàng)建的 Java 對象實(shí)例都是被直接分配在堆上。堆被所有的線程共享,在虛擬機(jī)啟動時,我們指定的 “Xmx” 之類參數(shù)就是用來指定大堆空間等指標(biāo)。理所當(dāng)然,堆也是垃圾收集器重點(diǎn)照顧的區(qū)域,所以堆空間還會被不同的垃圾收集器進(jìn)行進(jìn)一步的細(xì)分,最有名的就是新生代,老年代的劃分。
(4)方法區(qū),這是所有線程共享的一塊內(nèi)存區(qū)域,用于存儲所謂的元數(shù)據(jù),例如類結(jié)構(gòu)信息,以及對應(yīng)的運(yùn)行時常量池,字段,方法代碼等。由于早期的 Hotspot JVM 實(shí)現(xiàn),很多人習(xí)慣將方法區(qū)稱為永久代。Oracle JDK 8中將永久代移除,同時增加了元數(shù)據(jù)區(qū)。
(5)運(yùn)行時常量池,這是方法區(qū)的一部分。如果仔細(xì)分析過反編譯的類文件結(jié)構(gòu),你能看到版本號,字段,方法,超類,接口等各種信息,還有一項(xiàng)信息就是常量池。Java 的常量池可以存放各種常量信息,不管是編譯期生成的各種字面量,還是需要愛運(yùn)行時決定的符號引用,所以它比一般語言的符號表存儲的信息更加寬泛。
(6)本地方法棧,它和 Java 虛擬機(jī)是非常相似的,支持對本地方法的調(diào)用,也是每個線程都會創(chuàng)建一個。在 Oracle Hotspot JVM 中,本地方法棧和 Java 虛擬機(jī)棧是在同一塊區(qū)域,這完全取決于技術(shù)實(shí)現(xiàn)的決定,并未在規(guī)范中強(qiáng)制。
2、運(yùn)行數(shù)據(jù)區(qū)
我們將類加載入方法區(qū)的時候,就已經(jīng)開始使用運(yùn)行時數(shù)據(jù)區(qū)了。每個部分各司其職經(jīng)典的運(yùn)行時數(shù)據(jù)區(qū),一共包含五個部分,如下圖:
3、生命周期
程序啟動產(chǎn)生進(jìn)程,一個虛擬機(jī)對應(yīng)一個進(jìn)程,其中(綠色):方法區(qū)和堆跟進(jìn)程的生命周期是一致的。隨著虛擬機(jī)啟動而創(chuàng)建,隨著虛擬機(jī)退出而銷毀 。另外(藍(lán)色):程序計(jì)數(shù)器,本地方法棧,虛擬機(jī)棧,是與線程一一對應(yīng)的。與線程對應(yīng)的數(shù)據(jù)區(qū)域會隨著線程開始和結(jié)束而創(chuàng)建和銷毀。
1個運(yùn)行的程序-->1個進(jìn)程--->假設(shè)里面4個線程: 那里面就有4組程序計(jì)數(shù)器,本地方法棧,虛擬機(jī)棧,而這4組程序計(jì)數(shù)器,本地方法棧,虛擬機(jī)棧公用方法區(qū)和堆空間。所以圖我們可以畫為:
4、了解JVM內(nèi)存的方法
(1)可以使用綜合性的圖形化工具,如 JConsole,VisualVM(注意,從 Oracle JDK 9 開始,VisualVM 已經(jīng)不再包含在 JDK 安裝包中)等。這些工具具體使用起來比較直觀,直接連接到 Java 進(jìn)程,然后就可以在圖形化界面里掌握內(nèi)存使用情況。以 JConsole 為例,其內(nèi)存頁面可以顯示常見的堆內(nèi)存和各種堆外部分使用狀態(tài)。
(2)使用命令行工具進(jìn)行運(yùn)行時查詢,如 jstat 和 jmap 等工具都提供了一些選項(xiàng),可以查看堆,方法區(qū)等使用數(shù)據(jù)。
(3)使用 jmap 等提供的命令,生成堆轉(zhuǎn)儲文件,然后利用 jhat 或者 Eclipse MAT 等堆轉(zhuǎn)儲分析工具進(jìn)行詳細(xì)分析。
(4)GC日志等輸出,也包含著豐富的信息。
看完上述內(nèi)容,你們對如何劃分JVM內(nèi)存區(qū)域有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道,感謝大家的支持。