日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

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

JAVA虛擬機在執(zhí)行Java程序的過程中會把它所管理的內(nèi)存劃分為若干個不同的數(shù)據(jù)區(qū)域。Java虛擬機所管理的內(nèi)存包括如下幾個部分:

Java內(nèi)存結(jié)構(gòu)

 

程序計數(shù)器

程序計數(shù)器是一塊較小的空間,它可以看作是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器。由于Java虛擬機的多線程是通過線程輪流切換并分配處理器執(zhí)行時間的方式來實現(xiàn)的,在任何一個確定的時刻,一個處理器都只會執(zhí)行一條線程中的指令。因此為了線程切換后能恢復(fù)到正確的執(zhí)行位置,每條線程都需要一個獨立的程序計數(shù)器,各條線程之間計數(shù)器互不影響,獨立存儲。

如果線程正在執(zhí)行一個Java方法,這個計數(shù)器記錄的是正在執(zhí)行的虛擬機字節(jié)碼指令的地址;如果線程正在執(zhí)行的是一個Native方法,這個計數(shù)器則為空。此內(nèi)存區(qū)域是唯一一個在Java虛擬機規(guī)范中沒有規(guī)定任何OutOfMemoryError情況的區(qū)域。

Java虛擬機棧

虛擬機棧描述的是Java方法執(zhí)行的內(nèi)存模型:每個方法在執(zhí)行的同時都會創(chuàng)建一個棧幀用于存儲局部變量表、操作數(shù)棧、動態(tài)鏈接、方法出口等信息。如下:

Java內(nèi)存結(jié)構(gòu)

 

每一個方法從調(diào)用直至執(zhí)行完成的過程,就對應(yīng)著一個棧幀在虛擬機棧中入棧到出棧的過程。

局部變量表存放了編譯期可知的各種基本數(shù)據(jù)類型、引用類型(reference類型,它不等同于對象本身,可能是一個指向?qū)ο笃鹗嫉刂返囊弥羔?,也可能是指向一個代表對象的句柄或其他與此對象相關(guān)的位置)和returnAddress類型(指向了一條字節(jié)碼指令的地址)。

局部變量表所需的內(nèi)存空間在編譯期間完成分配,當(dāng)進(jìn)入一個方法時,這個方法需要在幀中分配多大的局部變量表空間是完全確定的,該方法運行期間不會改變局部變量表的大小。

在Java虛擬機規(guī)范中,對這個區(qū)域規(guī)定了兩種異常狀況:如果線程請求的棧深度大于虛擬機所允許的深度(例如一個方法循環(huán)的遞歸自己,不加任何控制),將拋出StackOverflowError異常:如果虛擬機??梢詣討B(tài)擴(kuò)展,擴(kuò)展時無法申請到足夠的內(nèi)存,就會拋出OutOfMemoryError異常。

本地方法棧

本地方法棧與虛擬機棧所發(fā)揮的作用是非常相似的,它們之間的區(qū)別不過是虛擬機棧為虛擬機執(zhí)行Java方法服務(wù),而本地方法棧則為虛擬機使用Native方法服務(wù)。與虛擬機棧一樣,本地方法棧也會拋出StackOverflowError和OutOfMemoryError異常。

Java堆

Java堆是Java虛擬機所管理的內(nèi)存中最大的一塊。Java堆是被所有線程共享的一塊內(nèi)存區(qū)域,在虛擬機啟動時創(chuàng)建。此內(nèi)存區(qū)域的唯一目的就是存放對象實例,幾乎所有的對象實例都在這里分配內(nèi)存。虛擬機規(guī)范中是這樣描述的:所有的對象實例以及數(shù)組都要在堆上分配。

Java堆是垃圾收集器管理的主要區(qū)域,因此很多時候也被稱作“GC堆”。具體的垃圾回收后面文章再詳細(xì)說。

根據(jù)Java虛擬機規(guī)范的規(guī)定,Java堆可以處于物理上不連續(xù)的內(nèi)存空間中,只要邏輯上是連續(xù)的即可,就像我們的磁盤空間一樣。在實現(xiàn)時,既可以實現(xiàn)成固定大小的,也可以是擴(kuò)展的,不過當(dāng)前主流虛擬機都是可擴(kuò)展的(通過-Xmx和-Xms控制)。如果堆中沒有內(nèi)存完成實例分配,并且堆也無法再擴(kuò)展時,就會拋出OutOfMemoryError異常。

方法區(qū)

方法區(qū)與Java堆一樣,是各個線程共享的內(nèi)存區(qū)域,它用于存儲已被虛擬機加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù)。

對于HotSpot虛擬機,方法區(qū)也可以叫做“永久代”(后面垃圾回收文章中將會詳細(xì)解釋)。Java虛擬機規(guī)范對方法區(qū)的限制非常寬松,除了和Java堆一樣不需要連續(xù)的內(nèi)存空間和可以選擇固定大小或者可擴(kuò)展外,還可以選擇不實現(xiàn)垃圾收集。

根據(jù)Java虛擬機規(guī)范的規(guī)定,當(dāng)方法區(qū)無法滿足內(nèi)存分配需求時,將拋出OutOfMemoryError異常。

運行時常量池

運行時常量池是方法區(qū)的一部分。Class文件中除了有類的版本、字段、方法、接口等描述信息外,還有一項信息是常量池,用于存放編譯器生成的各種 字面量 和 符號引用 ,這部分內(nèi)容將在類加載后進(jìn)入方法區(qū)的運行時常量池中。一般來說,Java虛擬機還會把翻譯出來的 直接引用 也存儲在運行時常量池中。

  • 字面量:代碼中固定值的表示法,例如:int i = 1; 1就是字面量。
  • 符號引用:在Java中,編譯時,java類并不知道所引用類的實際地址,因此只能使用符號引用來代替,比如People類中引用了Student類,在編譯時,并不知道Student類的實際內(nèi)存地址,只能使用符號com.simple.Student來表示Student類的地址。
  • 直接引用:程序運行時可以定位到引用的東西(類、對象、變量或者方法等)的地址。

運行時常量池相對于Class文件常量池的另外一個重要特征是具備動態(tài)性,Java語言并不要求常量一定只有編譯期才能產(chǎn)生,也就是并非預(yù)置于Class文件中常量池的內(nèi)容才能進(jìn)入運行時常量池,運行期間也可能將新的常量放入池中,例如String類的intern()方法。

既然運行時常量池是方法區(qū)的一部分,自然也受到方法區(qū)內(nèi)存的限制,當(dāng)常量池?zé)o法再申請到內(nèi)存時將拋出OutOfMemoryError異常。

Class常量池是在編譯期每個class都有的,存放的是常量的符號引用。運行時常量池是在類加載完成之后,將每個Class常量池中的符號引用轉(zhuǎn)存到運行時常量池中,每個class都有一個運行時常量池,類在解析之后,將符號引用替換成直接引用。

直接內(nèi)存

直接內(nèi)存并不是Java虛擬機運行時數(shù)據(jù)區(qū)的一部分,也不是Java虛擬機規(guī)范中定義的內(nèi)存區(qū)域。但這部分內(nèi)存也被頻繁的使用,而且也可能導(dǎo)致OutOfMemoryError異常出現(xiàn)。在NIO中,引入了一種基于通道(Channel)于緩存區(qū)(Buffer)的I/O方式,它可以使用Native函數(shù)庫直接分配堆外內(nèi)存,然后通過一個存儲在Java堆中的DirectByteBuffer對象作為這塊內(nèi)存的引用進(jìn)行操作。這樣能在一些場景中顯著提高性能,因為避免了在Java堆和Native堆中來回復(fù)制數(shù)據(jù)。

直接內(nèi)存的分配不會受到Java堆大小的限制,但是,既然是內(nèi)存,肯定還是受到本機總內(nèi)存大小的限制。服務(wù)器管理員在配置虛擬機參數(shù)時,會根據(jù)實際內(nèi)存設(shè)置-Xmx等參數(shù)信息,但經(jīng)常忽略直接內(nèi)存,從而導(dǎo)致出現(xiàn)OutOfMemoryError異常。

分享到:
標(biāo)簽:內(nèi)存 Java
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運動步數(shù)有氧達(dá)人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定