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