1. 程式人生 > >Linux下malloc/free記憶體碎片問題

Linux下malloc/free記憶體碎片問題

通過對malloc,free原始碼的分析,發現在堆上分配記憶體,很容易造成記憶體碎片。記憶體碎片在這裡可以從兩個方面進行分析,實體地址的記憶體碎片和線性地址(虛擬地址)的記憶體碎片。

首先是實體地址的記憶體碎片,malloc_free_list大小依次為8,16,32....。那麼我們請求的大小加上4位元組的額外開銷,如果和malloc_free_list插槽的大小一致,就不會產生碎片,反之,就會。如請求大小為5,那麼加上額外開銷大小就為9,第一個插槽無法滿足,只有第二個插槽滿足,但是第二個插槽分配單位是16,那麼就是隻有9個位元組的大小,也要佔用一個16位元組的單元,相應的產生了7個位元組的記憶體碎片。對於小資料單元來說,因為每次請求記憶體,最小是一頁,比如對於第一個插槽,就會產生4096/8個單元,但程式不一定會申請這麼多小的記憶體塊,相應的這也不能高效的利用實體記憶體。這裡還有個問題,如果記憶體不斷的申請,如連續分配了多個物理頁面供一個插槽使用,那麼當釋放時,程式會把實體記憶體歸還給系統嗎?至少在free中,是沒有做的,也做不到,它只是簡單的把記憶體單元新增到malloc_free_list插槽中。關於物理頁面釋放的問題,只有通過核心程式碼,才能確定實體記憶體釋放的機制,而每個程式虛擬記憶體是通過vm_area_struct來管理的。

其次是線性地址的記憶體碎片,對於32位系統來說,使用者虛擬地址只有3G,除了程式程式碼段,資料段,棧...,留給堆的有效線性地址也是有限的。如果頻繁的分配小的記憶體塊,他就會佔用小的頁面,這樣當程式釋放記憶體時,就會產生許多小的不連續的線性地址,當程式需要連續大的線性地址時,就會產生麻煩。具體是怎麼實現的,等查了核心程式碼就明白了。

通過以上分析,對於在堆上申請記憶體,是會產生一定代價的,特別是濫用,後果也是比較嚴重的。記憶體碎片是需要關注的問題。

相關推薦

Linuxmalloc/free記憶體碎片問題

通過對malloc,free原始碼的分析,發現在堆上分配記憶體,很容易造成記憶體碎片。記憶體碎片在這裡可以從兩個方面進行分析,實體地址的記憶體碎片和線性地址(虛擬地址)的記憶體碎片。 首先是實體地址的記憶體碎片,malloc_free_list大小依次為8,16,32...

malloc/free記憶體碎片產生的原因

記憶體碎片一般是由於空閒的連續空間比要申請的空間小,導致這些小記憶體塊不能被利用.產生記憶體碎片的方法很簡單,舉個例:          假設有一塊一共有100個單位的連續空閒記憶體空間,範圍是0~99.如果你從中申請一塊記憶體,如10個單位,那麼申請出來的記憶體塊就為0~9區間.這時繼續申請一塊記憶體,比如

linuxmalloc()和free()的原理及實現

在學習C語言的時候知道了動態記憶體分配的概念,也知道了malloc()的使用方式,但是一直沒有去了解或者認真學習malloc()的實現原理。今天看到關於動態記憶體分配方面的資料,就整理總結下。 在C語言中只能通過malloc()和其派生的函式進行動態的申請記憶

linux使用free命令檢視實際記憶體佔用(可用記憶體

轉:http://blog.is36.com/linux_free_command_for_memory/ linux下在終端環境下可以使用free命令看到系統實際使用記憶體的情況,一般用free -m方式檢視記憶體佔用情況(兆為單位)。而系統實際可用記憶體是不是f

linuxmalloc開辟內存失敗的問題

處理 好的 cal alloc 系統 實現 c++ 宋體 分配 操作系統: ubuntu 17.04 開發語言:QT 程序是在QT下面編譯C的PURE-FTP代碼,實現了FTP上傳功能。同時我需要結合我自己的應用來控制文件的上傳和下載功能。還可以4個G,而pu

Linux修改TomcatJVM記憶體大小

要新增在tomcat 的bin 下catalina.sh 裡,位置cygwin=false前 。注意引號要帶上,JAVA_OPTS這行為新新增的. # OS specific support. $v

linux檢視程序記憶體使用情況

動態檢視一個程序的記憶體使用 1、top命令 top -d 1 -p pid [,pid ...] //設定為delay 1s,預設是delay 3s 如果想根據記憶體使用量進行排序,可以shift + m(Sort by memory usage) 靜態檢視一個程序的記憶

淺析Linux的堆記憶體管理

  最近在看一本叫《程式設計師的自我修養-連結.裝載域庫》(俞甲子,石凡,潘愛民 著)這本書,不得不像大家安利這本書,從最基本的EFL檔案到連結,再到裝載,雖然現在還沒看完,但是對程式的可執行檔案和虛擬記憶體的佈局有了進一步的瞭解,不得不說是一本好書。言歸正傳,本文討論的話

Windows/LinuxC/C++記憶體洩露檢測工具

一 Window下的記憶體洩露檢測(以VC++環境為例) 靈活自由是C語言的一大特色,但這個特色也難以避免的帶來一些副作用,比如記憶體洩露。眾所周知,記憶體洩露的問題比較複雜,程式正常執行時你看不出它有任何異常,但長時間執行或在特定條件下特定操作重複多次時,它才暴露出來。所

Linux的共享記憶體(01)---檢視和釋放共享記憶體

說明: 1、檢視共享記憶體,使用命令ipcs:ipcs -m 2、刪除共享記憶體,使用命令ipcrm:ipcrm -m [shmid] 使用如下: [[email protected]

linux的虛擬記憶體和分頁分段機制

前言:由於計算機的記憶體是有限的,比0到2的32次方就是對應4G,這時候作業系統就引入了虛擬記憶體這一個概念, 1,首先可以從程式的編譯下手,對於java或者c++而言,程式在編譯的時候需要記憶體,但是此時程式並沒有在真的物理機上執行著,所以就引入虛擬記憶體這

linuxjava高記憶體故障排查

搞Java開發的,經常會碰到下面兩種異常: 1、java.lang.OutOfMemoryError: PermGen space 2、java.lang.OutOfMemoryError: Java heap space 要詳細解釋這兩種異常,需要簡單重提下Java

linuxtomcat伺服器記憶體、埠及監控使用者配置

記憶體配置: 我的伺服器的配置:  # OS specific support.  $var _must_ be set to either true or false. JAVA_OPTS="-Xms1024m -Xmx4096m -Xss1024K -XX:P

LINUX如何檢視記憶體品牌和速率啊?

背景:想加個記憶體,Mysql伺服器上的記憶體不夠了,就算可以插(插槽都有,現在是4條4G記憶體,還有空閒八個槽。),不知道兼不相容,否則不穩定的,不相容的話,死的更慘,這個不一定了,停產了,就沒有辦法了。怎麼辦?得看記憶體的品牌及型號。[[email prote

LinuxC的記憶體對齊

本文全文參考:http://blog.csdn.net/wendy260310/article/details/17675983 該部落格是在Linux下C++測試的,我在他的基礎上測試了C語言的結構體,環境採用Windows下DEV,由於都是GCC編譯器,所以其本質是一樣

Linux程序記憶體管理之malloc和sbrk

之前自己突發興趣想寫一下malloc函式,順便了解一下程序的記憶體管理。在寫的過程中發現其實malloc只不過是通過呼叫Linux下的sbrk函式來實現記憶體的分配,只是在sbrk之上加了一層對所分配的記憶體的管理罷了,而sbrk以及brk是實現從虛擬記憶體到記憶體的對映的

mallocfree記憶體碎片

malloc和free大量使用後回造成記憶體碎片,那麼這種碎片形成的機理是什麼?    如果機理是申請的記憶體空間大小(太小)所形成的,那麼,申請多大的區域能夠最大限度的避免記憶體碎片呢?(這裡的避免不是絕對的避免,只是一種概率) 記憶體碎片一般是由於空閒的連續空間比要申請

監控io性能,free命令,ps網絡命令,查看網絡狀態,Linux抓包

free io 筆記內容:l 10.6 監控io性能l 10.7 free命令l 10.8 ps命令l 10.9 查看網絡狀態l 10.10 linux下抓包筆記日期:2017.8.25 10.6 監控io性能磁盤的io是一個非常重要的指標,所以要更詳細的查看磁盤狀態,需要用到iostat命令,如果之

監控io性能、free命令、ps命令、查看網絡狀態、linux抓包

監控io性能 free命令 ps命令 查看網絡狀態 linux下抓包 監控io性能簡介iostat主要用於監控系統設備的IO負載情況,iostat首次運行時顯示自系統啟動開始的各項統計信息,之後運行iostat將顯示自上次運行該命令以後的統計信息。用戶可以通過指定統計的次數和時間來獲得所需

監控io性能,free,ps,查看網絡狀態,Linux抓包

ado tshark alt thread ios shadow free iostat 情況 監控IO 性能iotopiostat -x 1 每秒刷新一次,著重關註%util free 查看內存使用情況 PSps aux 查看網絡狀態netstat 附:擴展tcp三次握