自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java程序中經(jīng)常用到的內(nèi)存模塊到底有哪些?

云計算 虛擬化
我們寫代碼時,通常會關(guān)注代碼與對象之間的流轉(zhuǎn)。但實際上,我們有沒有認真去關(guān)注過 java 程序運行時,類、對象、局部變量與方法調(diào)用鏈是存放在哪里的呢?

前言

我們寫代碼時,通常會關(guān)注代碼與對象之間的流轉(zhuǎn)。但實際上,我們有沒有認真去關(guān)注過 java 程序運行時,類、對象、局部變量與方法調(diào)用鏈是存放在哪里的呢?

[[286800]]

JVM 內(nèi)存

眾所周知,java 程序是執(zhí)行在 jvm 虛擬機中的,那在眾多的 jvm 虛擬機中,HotSpot VM 是當下最熱門的或者說使用得最多的 jvm 版本。在 HotSpot VM 中,整個虛擬機內(nèi)存被劃分為幾大模塊:

  • 堆(Heap)
  • 方法區(qū)(Method Area)
  • 程序計數(shù)器(Program Counter Register)
  • 虛擬機棧(JVM Stacks)
  • 本地方法棧(Native Method Stacks)

 

 

堆(Heap)

該區(qū)域就是我們平時正常 new 出來的對象待的地方,該區(qū)域也是我們平時接觸得最多的區(qū)域,這里細分為:Young Generation(新生代) 和 Old Generation(老生代) ,也就是我們平時經(jīng)常關(guān)注的 YGC 和 FGC 的地方,而 Young Generation 中間又再細分為三個區(qū)域:Eden、From Survivor、To Survivor,YGC 會有各種的算法來對這三塊區(qū)域做針對性的垃圾回收算法,這里就先不展開討論,有興趣的可以參考 面試官,不要再問我“JAVA GC垃圾回收機制”了 。

該區(qū)域是所有線程所共享的,而存放的又是主要的業(yè)務(wù)對象,所以空間相對來說會是比較大的。一般可以使用 -Xms設(shè)置堆的最小空間大小 和 -Xmx設(shè)置堆的最大空間大小。

 

 

方法區(qū)(Method Area)

方法區(qū)和剛說的棧區(qū)域有很多相似的地方:線程共享、內(nèi)存不連續(xù)、可擴展、可垃圾回收,同樣當無法再擴展時會拋出OutOfMemoryError異常。而方法區(qū)通常也被稱為非堆區(qū)域(non-heap),注意這要與堆外內(nèi)存區(qū)分開!

方法區(qū)它存儲的是已被虛擬機加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù)。就是一些與運行時生成的對象區(qū)別開,是一個固定存放物資的區(qū)域。

方法區(qū)的內(nèi)存回收目標主要是針對常量池的回收和對類型的卸載,一般來說這個區(qū)域的回收“成績”比較難以令人滿意,尤其是類型的卸載,條件相當苛刻,但是回收確實是有必要的。

 

 

程序計數(shù)器(Program Counter Register)

程序計數(shù)器的作用可以看做是當前線程所執(zhí)行的字節(jié)碼的行號指示器,字節(jié)碼解釋器工作時就是通過改變計數(shù)器的值來選取下一條字節(jié)碼指令。其中,分支、循環(huán)、跳轉(zhuǎn)、異常處理、線程恢復(fù)等基礎(chǔ)功能都需要依賴計數(shù)器來完成。

Java虛擬機的多線程是通過線程輪流切換并分配處理器執(zhí)行時間的方式來實現(xiàn)的,在任何一個確定的時刻,一個處理器(對于多核處理器來說是一個內(nèi)核)只會執(zhí)行一條線程中的指令,必須要有一個地方儲存每個線程具體處理到哪一步了,該區(qū)域就是做這件事了。

 

 

虛擬機棧(JVM Stacks)

學(xué)習(xí)過匯編語言的同學(xué)也許會比較容易理解它的作用。它是一個記錄線程調(diào)用方法模型的棧,每一條線程私有一個虛擬機棧,所以它也與對應(yīng)線程生死與共。

其每個方法模型被稱為棧幀,棧幀會存放 4 個屬性:局部變量表、操作棧、動態(tài)鏈接、方法返回地址。

 

 

ps:對于其中的局部變量,如果是變量為基礎(chǔ)類型,棧幀會直接存儲對應(yīng)的值,但如果是高級類型的話只會存放值的引用。

本地方法棧(Native Method Stacks)

與虛擬機棧作用相似,也會拋出 StackOverflowError 和 OutOfMemoryError 異常。

區(qū)別在于虛擬機棧為虛擬機執(zhí)行Java方法(字節(jié)碼)服務(wù),而本地方法棧是為虛擬機使用到的Native方法服務(wù)。

對于 jvm 的內(nèi)存,我們可以用這樣的一張圖來歸納起來以幫助對比理解。

 

堆外內(nèi)存(Off-Heap Memory)

區(qū)別于 JVM 內(nèi)存,java 常用的還有堆外內(nèi)存。雖然 JVM 內(nèi)存擁有非常完善的垃圾管理機制,可以讓開發(fā)人員無需關(guān)注內(nèi)存資源回收隨心所欲地進行開發(fā),但也正因為存在一連串非常復(fù)雜精妙的垃圾管理算法,導(dǎo)致在高并發(fā)情況(特別是寫內(nèi)存多)下可能會出現(xiàn)頻繁的 YGC 和 FGC (每次 GC 都會引起程序卡頓),反而會成為性能瓶頸的幫兇!

針對這一類的業(yè)務(wù)情況,我們通常會使用堆外內(nèi)存來提升我們的性能水平。堆外內(nèi)存其實就是游離于 JVM 管理之外的物理機內(nèi)存。不屬于 JVM 的管理,自然就沒有了 JVM 的那套 GC 算法,這樣能使我們有更加好的擴展性和 IO 速度。

在JAVA中,可以通過Unsafe和NIO包下的ByteBuffer來操作堆外內(nèi)存,也可以使用第三方堆外緩存管理包例如 ohc(off-heap-cache) 來操作。

 

責任編輯:武曉燕 來源: Segmentfault
相關(guān)推薦

2010-03-22 15:38:46

Python常用模塊

2022-10-09 07:33:38

JavaSPI程序

2020-12-14 09:46:57

DDoS攻擊網(wǎng)絡(luò)攻擊網(wǎng)絡(luò)安全

2013-01-18 11:28:27

應(yīng)用推廣

2019-01-21 08:13:27

RAID類型磁盤

2020-11-12 08:24:06

云計算公共云

2024-11-11 10:15:04

CPULinux系統(tǒng)

2010-06-10 13:34:17

MySQL5

2018-01-26 17:35:56

前端程序員月薪

2020-08-05 07:00:00

SSD硬盤存儲

2012-05-29 13:34:39

2022-02-16 23:11:04

iOS蘋果功能

2016-09-22 16:47:55

iOSAndroidWindows Pho

2022-09-01 21:02:31

手機衛(wèi)星5G

2015-08-19 09:15:11

C#程序員實用代碼

2019-05-16 10:30:49

JavaTCP協(xié)議

2015-10-29 10:30:41

C#程序員實用代碼

2010-03-16 15:38:57

Python串口

2022-05-10 15:10:25

加密貨幣區(qū)塊鏈金融犯罪

2012-08-23 15:10:44

Facebook
點贊
收藏

51CTO技術(shù)棧公眾號