一次线上内存报警的研究
一丶背景
項(xiàng)目出現(xiàn)內(nèi)存報(bào)警,當(dāng)我們導(dǎo)出大文件excel的時(shí)候。以下是相關(guān)參數(shù)與猜想。
jvm參數(shù):-Xms8192m
excel文件大小:一個(gè)二十多萬行的excel數(shù)據(jù)。
報(bào)警條件:物理內(nèi)存高于80%會(huì)觸發(fā)報(bào)警
相關(guān)猜想:按理說堆內(nèi)存我們一來就分配好8個(gè)g的物理內(nèi)存,導(dǎo)出文件觸發(fā)的堆內(nèi)存增長應(yīng)該不會(huì)引起物理內(nèi)存的增長。
二丶結(jié)論
此次報(bào)警,屬于正常能預(yù)期到的現(xiàn)象,我們線上程序并未受到影響。我們jvm參數(shù)配置Xms8192m,實(shí)際上分配的是虛擬地址空間,并不是實(shí)際的物理內(nèi)存,導(dǎo)出excel的時(shí)候堆空間大量增長,那么對(duì)應(yīng)的虛擬地址就會(huì)去大量的命中實(shí)際的物理內(nèi)存,所以就算我們堆空間的內(nèi)存降下去后,實(shí)際命中的物理內(nèi)存也分配給了對(duì)應(yīng)的堆內(nèi)存,導(dǎo)致物理內(nèi)存永久下降。
三丶虛擬地址空間
我們的進(jìn)程其實(shí)是運(yùn)行在虛擬地址空間里,cpu的尋物理內(nèi)存址過程其實(shí)是對(duì)虛擬地址的地址翻譯后再找到實(shí)際的物理地址。
為什么我們使用虛擬地址呢?
讓每個(gè)進(jìn)程擁有了相同的、獨(dú)立內(nèi)存空間,相互之間不會(huì)干擾
- 如果沒有虛擬地址,每個(gè)進(jìn)程直接對(duì)物理內(nèi)存進(jìn)行操作,勢(shì)必會(huì)存在各個(gè)進(jìn)程相互影響而無法正常進(jìn)行。
方便各個(gè)進(jìn)程之間內(nèi)存共享
- 可以映射到不同的物理內(nèi)存。其實(shí)不同進(jìn)程的虛擬地址也可以映射到相同的物理內(nèi)存以實(shí)現(xiàn)內(nèi)存共享。
- 比如每個(gè)操作系統(tǒng)的進(jìn)程,都會(huì)需要跟內(nèi)核程序打交道。有了內(nèi)存共享,多個(gè)進(jìn)程間就可以共用內(nèi)核程序,而不需要為每一個(gè)進(jìn)程在物理內(nèi)存里加載一份內(nèi)核程序。
不連續(xù)的物理空間可以映射成連續(xù)的虛擬地址空間
- 可以將碎片化的物理內(nèi)存映射到連續(xù)的虛擬地址。
進(jìn)程分配的內(nèi)存空間只有在實(shí)際使用時(shí),才會(huì)觸發(fā)缺頁異常來分配實(shí)際物理空間,從而最大程度減少了內(nèi)存空間的浪費(fèi)。
- 在我們使用虛擬地址空間時(shí),如果沒有對(duì)應(yīng)的物理內(nèi)存,就會(huì)出現(xiàn)我們常見的緩存不命中的情況。專業(yè)術(shù)語叫缺頁異常。這時(shí)內(nèi)核的缺頁異常處理程序,將會(huì)幫助我們分配物理內(nèi)存,如果物理內(nèi)存不足,它將會(huì)選擇一個(gè)物理內(nèi)存頁作為犧牲,寫回磁盤上,這也就是我們所說的交換分區(qū)(linux叫做交換區(qū),window上叫做虛擬內(nèi)存)。
四丶jvm與虛擬地址空間
JVM進(jìn)程,本質(zhì)上就是一個(gè)用c++寫的普通進(jìn)程,起開始申請(qǐng)的地址其實(shí)是一個(gè)虛擬地址空間,并不是實(shí)際的物理內(nèi)存,必須在分配的虛擬地址空間實(shí)際使用才會(huì)觸發(fā)分配實(shí)際的物理內(nèi)存。
五丶相關(guān)佐證
從下圖可以看出我們生產(chǎn)環(huán)境配置的物理內(nèi)存的使用是遠(yuǎn)遠(yuǎn)小于我們分配的jvm參數(shù)配置Xms8192m,說明并不是隨著程序的啟動(dòng)就分配了對(duì)應(yīng)的物理內(nèi)存。
六丶總結(jié)
我們生產(chǎn)環(huán)境監(jiān)控的物理內(nèi)存是監(jiān)控包含了一部分的堆內(nèi)存的大小,但是我們堆內(nèi)存設(shè)置為-Xms8192m -Xmx8192m -Xmn2048m。實(shí)際上這個(gè)監(jiān)控意義不大,因?yàn)檫@個(gè)年老代內(nèi)存的增長是隨著程序的運(yùn)行時(shí)必定增長的。
七丶擴(kuò)展-缺頁
看完上述后相信有人肯定還有一些疑問,缺頁到命中物理內(nèi)存是怎么一個(gè)過程,那么首先我們的需要了解一些概念,虛擬內(nèi)存,虛擬頁,物理頁,物理內(nèi)存,頁表,DRAM。
虛擬內(nèi)存:
- 虛擬內(nèi)存被組織為一個(gè)由存放在磁盤上的N個(gè)連續(xù)的字節(jié)大小的單元組成的數(shù)組,本質(zhì)時(shí)磁盤上的對(duì)象,而每個(gè)自己對(duì)應(yīng)的地址,我們就理解為虛擬地址。
虛擬頁:
- 就是虛擬內(nèi)存分割為固定大小的塊,我們就叫做虛擬頁,由上可以得知。虛擬頁實(shí)際上時(shí)在磁盤上的
物理頁:
- 物理內(nèi)存分割為固定大小的塊,叫做物理頁
DRAM:
- 虛擬內(nèi)存系統(tǒng)的緩存,在主存中緩存虛擬頁,說通俗點(diǎn),就是物理內(nèi)存對(duì)應(yīng)的虛擬系統(tǒng)(自己理解)
頁表:
頁表就是一個(gè)頁表?xiàng)l目的數(shù)組,功能是將虛擬頁映射到物理頁,我們每次讀取虛擬地址時(shí),實(shí)際上讀取的就是頁表。頁表可以形象的理解為虛擬頁和物理頁的一個(gè)管理,DRAM緩存內(nèi)存時(shí),如果緩存了物理地址,那么虛擬地址就能直接映射到物理地址,如果頁表上沒有緩存物理頁,那么就是缺頁異常,需要進(jìn)行一次頁面調(diào)度
頁面調(diào)度過程與缺頁異常 :
當(dāng)我們?nèi)ビ锰摂M內(nèi)存地址時(shí),我們DRAM沒有緩存到物理頁時(shí),會(huì)觸發(fā)一個(gè)缺頁異常,內(nèi)核會(huì)選擇一個(gè)空閑的物理頁作為犧牲頁,并且將虛擬頁磁盤的上復(fù)制到對(duì)應(yīng)的物理頁,那么這個(gè)虛擬頁就緩存到了對(duì)應(yīng)的物理頁,虛擬地址就能直接映射物理地址了,完成了一次頁面調(diào)度
八丶參考書籍
《深入理解計(jì)算機(jī)系統(tǒng)-第三版》
總結(jié)
以上是生活随笔為你收集整理的一次线上内存报警的研究的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: xz解压
- 下一篇: 设置Grid某列的Title样式和列内数