日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Java中內(nèi)存區(qū)域的劃分與異常詳解-創(chuàng)新互聯(lián)

前言

成都創(chuàng)新互聯(lián)于2013年開始,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都網(wǎng)站設(shè)計、成都做網(wǎng)站網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元龍山做網(wǎng)站,已為上家服務(wù),為龍山各地企業(yè)和個人服務(wù),聯(lián)系電話:18980820575

JAVA內(nèi)存區(qū)域主要由程序計數(shù)器、java 虛擬機(jī)棧、本地方法棧、Java堆、方法區(qū)以及運(yùn)行時常量池組成。本文將給大家詳細(xì)介紹關(guān)于Java內(nèi)存區(qū)域的劃分與異常的相關(guān)內(nèi)容,下面話不多說了,來一起看看詳細(xì)的介紹吧。

運(yùn)行時數(shù)據(jù)區(qū)域


JVM在運(yùn)行Java程序時候會將內(nèi)存劃分為若干個不同的數(shù)據(jù)區(qū)域。


程序計數(shù)器


線程私有??煽醋魇?當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器 ,字節(jié)碼解釋器的工作是通過改變這個計數(shù)值來讀取下一條要執(zhí)行的字節(jié)碼指令。

多線程是通過線程輪流切換并分配處理器執(zhí)行時間來實現(xiàn)的,任何一個時刻,一個內(nèi)核只能執(zhí)行一條線程中的指令。 為了線程切換后能恢復(fù)到正確的執(zhí)行位置,每條線程都需要一個獨(dú)立的程序計數(shù)器 。這就是一開始說的“線程私有”。如果線程正在執(zhí)行的方法是Java方法,計數(shù)器記錄的是虛擬機(jī)字節(jié)碼的指令地址;如果是Native方法,計數(shù)器值為空。 程序計數(shù)器是唯一一個在Java虛擬機(jī)規(guī)范中沒有規(guī)定OOM(OutOfMemoryError)情況的區(qū)域 。

Java虛擬機(jī)棧


線程私有,生命周期和線程相同。Java虛擬機(jī)棧描述的是Java方法的內(nèi)存模型:每個方法在執(zhí)行時都會創(chuàng)建一個棧幀,存儲 局部變量表、操作數(shù)棧、動態(tài)鏈接、方法出口信息 ,每一個方法從調(diào)用到結(jié)束,就對應(yīng)這一個棧幀在虛擬機(jī)棧中的進(jìn)棧和出棧過程。局部變量表保存了各種基本數(shù)據(jù)類型(int、double、char、byte等)、對象引用(不是對象本身)和returnAddress類型(指向了一條字節(jié)碼地址)。

這部分區(qū)域可能發(fā)生兩種異常:

  • 線程請求的棧深度大于虛擬機(jī)所允許的深度,拋出StackOverflowError;
  • 虛擬機(jī)棧擴(kuò)展時無法申請到足夠的內(nèi)存,拋出OutOfMemoryError。

本地方法棧


上述虛擬機(jī)棧為JVM執(zhí)行Java方法服務(wù),本地方法則為執(zhí)行Native服務(wù)。其他和虛擬機(jī)棧類似,也會拋出StackOverflowError、OutOfMemoryError。

Java堆


常說的“棧內(nèi)存”、“堆內(nèi)存”,其中前者指的是虛擬機(jī)棧,后者說的就是Java堆了。 Java堆是被線程共享的 。在虛擬機(jī)啟動時被創(chuàng)建。

Java堆的作用是存放對象實例,Java堆可以處于物理上不連續(xù)的內(nèi)存空間中,只要求邏輯上連續(xù)即可。

方法區(qū)


線程共享的區(qū)域。存儲已被虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即使編譯器編譯后的代碼等數(shù)據(jù)。方法區(qū)無法滿足內(nèi)存分配需求時,拋出OutOfMemoryError。

運(yùn)行時常量池


運(yùn)行時常量池 是方法區(qū)的一部分 。C用于存放編譯期生成的各種字面常量和符號引用,將在類加載后進(jìn)入方法區(qū)的運(yùn)行時常量池中存放。 Java語言不要求常量只能在編譯期產(chǎn)生,換言之,在運(yùn)行期間也能將新的常量放入 。

直接內(nèi)存


直接內(nèi)存不屬于虛擬機(jī)運(yùn)行時數(shù)據(jù)區(qū)的一部分,也不是內(nèi)存區(qū)域。本機(jī)直接內(nèi)存的分配不會受到Java堆的大小限制,但終究是內(nèi)存,如果各個內(nèi)存區(qū)域總和大于物理內(nèi)存限制,還是會出現(xiàn)OutOfMemoryError。

對象的創(chuàng)建過程


虛擬機(jī)遇到一條"new"指令:

  • 首先檢查這個指令的參數(shù)是否能在常量池中定位到一個類的符號引用;
  • 檢查這個符號引用代表的類是否已被加載、解析、初始化;(如果沒有,則必須先進(jìn)行類的加載)
  • 在Java堆中為新對象分配內(nèi)存,所需大小在類加載后就確定了;
  • 將分配到的內(nèi)存空間都初始化為0(不包括對象頭)
  • 類的初始化,即init方法,吧對象按照程序員的意愿初始化為想要的值。

對象的內(nèi)存布局


對象在內(nèi)存中存儲的布局可以分為3塊區(qū)域:

  1. 對象頭
  2. 實例數(shù)據(jù)
  3. 對齊補(bǔ)充

對象頭:存儲對象自身的運(yùn)行時數(shù)據(jù),比如哈希碼、GC分代年齡、鎖狀態(tài)標(biāo)志、線程持有的鎖、偏向線程ID等。另外還有一部分是類型指針, 即對象指向它的類元數(shù)據(jù)的指針,虛擬機(jī)通過該指針來確定這個對象屬于哪個類的實例。

實例數(shù)據(jù):對象真正有效的信息,在程序中定義的各種類型的字段內(nèi)容;

對齊補(bǔ)充:非必須,占用符的作用。

對象的訪問定位


Java程序通過棧上的引用來操作堆上的實例對象。比如

Person p = new Person();

當(dāng)前文章:Java中內(nèi)存區(qū)域的劃分與異常詳解-創(chuàng)新互聯(lián)
本文URL:http://www.dlmjj.cn/article/cdcgjd.html