日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

java进程内存一直没释放_五分钟彻底搞懂你一直没明白的Linux内存管理

發布時間:2024/7/23 linux 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java进程内存一直没释放_五分钟彻底搞懂你一直没明白的Linux内存管理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

現在的服務器大部分都是運行在Linux上面的,所以,作為一個程序員有必要簡單地了解一下系統是如何運行的。對于內存部分需要知道:

  • 地址映射
  • 內存管理的方式
  • 缺頁異常
  • 先來看一些基本的知識,在進程看來,內存分為內核態和用戶態兩部分,經典比例如下:

    從用戶態到內核態一般通過系統調用、中斷來實現。用戶態的內存被劃分為不同的區域用于不同的目的:

    當然內核態也不會無差別地使用,所以,其劃分如下:

    下面來仔細看這些內存是如何管理的。

    地址

    在Linux內部的地址的映射過程為邏輯地址–>線性地址–>物理地址,物理地址最簡單:地址總線中傳輸的數字信號,而線性地址和邏輯地址所表示的則是一種轉換規則,線性地址規則如下:

    這部分由MMU完成,其中涉及到主要的寄存器有CR0、CR3。機器指令中出現的是邏輯地址,邏輯地址規則如下:

    在Linux中的邏輯地址等于線性地址,也就是說Inter為了兼容把事情搞得很復雜,Linux簡化順便偷個懶。

    內存管理的方式

    在系統boot的時候會去探測內存的大小和情況,在建立復雜的結構之前,需要用一個簡單的方式來管理這些內存,這就是bootmem,簡單來說就是位圖,不過其中也有一些優化的思路。

    bootmem再怎么優化,效率都不高,在要分配內存的時候畢竟是要去遍歷,buddy系統剛好能解決這個問題:在內部保存一些2的冪次大小的空閑內存片段,如果要分配3page,去4page的列表里面取一個,分配3個之后將剩下的1個放回去,內存釋放的過程剛好是一個逆過程。用一個圖來表示:

    可以看到0、4、5、6、7都是正在使用的,那么,1、2被釋放的時候,他們會合并嗎?

    static inline unsigned long
    __find_buddy_index(unsigned long page_idx, unsigned int order)
    {
    return page_idx ^ (1 << order);// 更新最高位,0~1互換
    }

    從上面這段代碼中可以看到,0、1是buddy,2、3是buddy,雖然1、2相鄰,但他們不是。內存碎片是系統運行的大敵,伙伴系統機制可以在一定程度上防止碎片~~另外,我們可以通過cat /proc/buddyinfo獲取到各order中的空閑的頁面數。

    伙伴系統每次分配內存都是以頁(4KB)為單位的,但系統運行的時候使用的絕大部分的數據結構都是很小的,為一個小對象分配4KB顯然是不劃算了。Linux中使用slab來解決小對象的分配:

    在運行時,slab向buddy“批發”一些內存,加工切塊以后“散賣”出去。隨著大規模多處理器系統和NUMA系統的廣泛應用,slab終于暴露出不足:

  • 復雜的隊列管理
  • 管理數據和隊列存儲開銷較大
  • 長時間運行partial隊列可能會非常長
  • 對NUMA支持非常復雜
  • 為了解決這些高手們開發了slub:改造page結構來削減slab管理結構的開銷、每個CPU都有一個本地活動的slab(kmem_cache_cpu)等。對于小型的嵌入式系統存在一個slab模擬層slob,在這種系統中它更有優勢。

    小內存的問題算是解決了,但還有一個大內存的問題:用伙伴系統分配10 x 4KB的數據時,會去16 x 4KB的空閑列表里面去找(這樣得到的物理內存是連續的),但很有可能系統里面有內存,但是伙伴系統分配不出來,因為他們被分割成小的片段。那么,vmalloc就是要用這些碎片來拼湊出一個大內存,相當于收集一些“邊角料”,組裝成一個成品后“出售”:

    之前的內存都是直接映射的,第一次感覺到頁式管理的存在:D 另外對于高端內存,提供了kmap方法為page分配一個線性地址。

    進程由不同長度的段組成:代碼段、動態庫的代碼、全局變量和動態產生數據的堆、棧等,在Linux中為每個進程管理了一套虛擬地址空間:

    在我們寫代碼malloc完以后,并沒有馬上占用那么大的物理內存,而僅僅是維護上面的虛擬地址空間而已,只有在真正需要的時候才分配物理內存,這就是COW(COPY-ON-WRITE:寫時復制)技術,而物理分配的過程就是最復雜的缺頁異常處理環節了,下面來看!

    缺頁異常

    在實際需要某個虛擬內存區域的數據之前,和物理內存之間的映射關系不會建立。如果進程訪問的虛擬地址空間部分尚未與頁幀關聯,處理器自動引發一個缺頁異常。在內核處理缺頁異常時可以拿到的信息如下:

  • cr2:訪問到線性地址
  • err_code:異常發生時由控制單元壓入棧中,表示發生異常的原因
  • regs:發生異常時寄存器的值
  • 處理的流程如下:

    發生缺頁異常的時候,可能因為不常使用而被swap到磁盤上了,swap相關的命令如下:

    如果內存是mmap映射到內存中的,那么在讀、寫對應內存的時候也會產生缺頁異常。

    來源:WsztRush
    鏈接:http://wsztrush.github.io/%E7%BC%96%E7%A8%8B%E6%8A%80%E6%9C%AF/2015/05/13/Linux-Memory.html 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的java进程内存一直没释放_五分钟彻底搞懂你一直没明白的Linux内存管理的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲69av| 婷婷五月精品中文字幕 | 美女免费黄色 | 91九色视频 | 九九热在线视频播放 | 国产精品亚洲一区二区三区在线观看 | 中文字幕在线观看一区二区三区 | 色视频免费在线观看 | 夜夜春影院 | 越南a级片 | 男女视频在线观看免费 | 懂色av一区二区三区蜜臀 | 又黄又爽视频 | 国产专区精品 | 国产又粗又猛又爽又黄视频 | 五月婷婷丁香花 | 免费三级在线 | 欧美日韩国产网站 | 在线观看av免费 | 久久久综合色 | 亚洲三级国产 | 日本精品三级 | 韩国三级hd中文字幕有哪些 | 日韩极品视频在线观看 | 91精品亚洲 | av大片在线| 草比网站 | 久久久天堂 | 波多野结衣二区三区 | 女同亚洲精品一区二区三 | 中文字幕Av日韩精品 | 永久免费视频网站直接看 | 国内自拍偷拍视频 | 日韩在线视频免费 | 欧美四区 | 欧美性做爰免费观看 | 日日噜噜夜夜狠狠久久丁香五月 | 亚洲一区二区图片 | 大尺度舌吻呻吟声 | 国精产品一品二品国精品69xx | 99国产精品久久 | 国产精品五月天 | 久草福利资源在线观看 | 在线观看av日韩 | 国产xxx在线 | 欧美一区二区三区四区五区六区 | 欧美男人的天堂 | 午夜视频导航 | 黄色成人一级片 | 久久99国产视频 | 999精品在线观看 | 欧美精品一区视频 | 91蜜桃在线 | ass精品国模裸体pics | 国产亚洲精品久久久久久久久动漫 | 香港三级在线视频 | 久操视频在线观看免费 | 大牛影视剧免费播放在线 | 奇米影视888| 日本不卡1 | 男女国产视频 | 在哪里可以看毛片 | 久久午夜夜伦鲁鲁一区二区 | 欧洲成人在线观看 | 人妻体内射精一区二区三区 | 黄色免费视屏 | 精品国产乱码一区二区三 | 成人精品三级av在线看 | 69av网| 欧美日韩亚洲国产一区 | 少妇情理伦片丰满午夜在线观看 | 丁香久久久 | 男女靠逼视频 | 免费大片在线观看www | 国产绿帽刺激高潮对白 | 国产一级二级三级视频 | 日韩精品一区中文字幕 | 91av国产视频 | 欧美日韩加勒比 | 亚洲欧美综合另类自拍 | 一级黄色片在线免费观看 | 亚洲欧美日韩国产一区二区三区 | 天天色综 | 理论片一级 | 久国产视频 | 97超视频在线观看 | 国产欧美在线观看 | 免费99精品国产自在在线 | 日韩精品在线电影 | 一区二区在线观看免费视频 | caoporm超碰 | 精品无码一区二区三区免费 | 夜夜夜操操操 | 拔插拔插海外华人免费视频 | 桃色网站在线观看 | 91视频日本 | 免费在线不卡视频 | 美女扒开腿让男生桶 | 久久国产视频一区 |