日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

徹底理解內存泄漏,你學會了嗎?

來源: 責編: 時間:2024-02-02 09:20:57 207觀看
導讀大家好,我是小風哥,今天和大家聊一聊內存泄漏這個話題。在這些文章講到內存申請時我很喜歡用停車場來做類比,內存申請就好比去停車場找停車位,找到停車位后你就可以把車停在這里。從這個類比看什么是內存泄漏呢?內存泄漏看

大家好,我是小風哥,今天和大家聊一聊內存泄漏這個話題。Kk328資訊網——每日最新資訊28at.com

在這些文章講到內存申請時我很喜歡用停車場來做類比,內存申請就好比去停車場找停車位,找到停車位后你就可以把車停在這里。Kk328資訊網——每日最新資訊28at.com

從這個類比看什么是內存泄漏呢?內存泄漏看上去是停車場的車輛只進不出導致最終找不到停車位,從程序員的角度看就是內存只申請取不釋放,如果你去問,可能有不少人認為內存泄漏就是這么回事。Kk328資訊網——每日最新資訊28at.com

然而這其實是不全面的。Kk328資訊網——每日最新資訊28at.com

Kk328資訊網——每日最新資訊28at.com

申請過多內存Kk328資訊網——每日最新資訊28at.com

首先內存只申請不釋放未必就是內存泄漏,有可能是你的程序的確需要申請很多內存,這是正常的,然而如果是bug導致申請了很多內存,這就是內存泄漏了,或者也有人將其稱為space leak,意思是申請的內存超過了正常所需;不管是有意無意,總之在這種情況下你依然保持對這些內存的引用,因此你總可以找到這些內存并刪除它們,就看你刪不刪。Kk328資訊網——每日最新資訊28at.com

有很多情況會導致這一問題,像重復使用的某個結構體/對象,當再次復用時沒有清理上一次使用遺留的數據、系統中存在cache,但cache的過期策略設置不得當等等。Kk328資訊網——每日最新資訊28at.com

Kk328資訊網——每日最新資訊28at.com

內存無法刪除

另一類比較有趣的內存泄漏是說你申請了一些內存,但最終卻沒有什么指向它們:Kk328資訊網——每日最新資訊28at.com

void memory_leak() {  char* mem = (char*)malloc(1024);  // just return}

Kk328資訊網——每日最新資訊28at.com

在這段代碼中我們申請了1k內存,然而當memory_leak函數返回后你就再也不知道這段內存到底在哪里了!Kk328資訊網——每日最新資訊28at.com

用停車場的示例來說就是有些司機太過土豪,家里的車太多以至于把將車放在停車場這件事忘掉了,導致這些車根本就不會有人再開走,因此白白浪費停車位,并導致可用車位越來越少,而對于編程來說就是粗心大意的程序員申請了一些內存后最終“忘掉”了,再也不會有什么東西(變量/指針)指向這些內存,因此在這種情況下你沒有辦法再找到這些內存并將其刪除。Kk328資訊網——每日最新資訊28at.com

Kk328資訊網——每日最新資訊28at.com

內存碎片

這也算的上是一類特殊的內存泄漏,用停車場的例子來說就是兩個停車位中間停靠了一輛小型老年代步車,導致盡管這兩個停車位剩余的空間足夠大但又恰好都沒有辦法再停靠一輛小汽車。Kk328資訊網——每日最新資訊28at.com

假定我們系統中寶貴的內存大小只有8字節,其中有兩個字節已經分配出去了,就像這樣:Kk328資訊網——每日最新資訊28at.com

圖片圖片Kk328資訊網——每日最新資訊28at.com

現在,系統中空閑的內存是6字節,下一次的內存申請需要分配5字節,糟糕,我們已經沒有辦法再找到連續的5個字節大小的內存空間了,盡管全部空間的內存還有6字節,這就是所謂的內存碎片問題。Kk328資訊網——每日最新資訊28at.com

而對于內存分配器來說如果出現這種情況那么將不得不借助操作系統的幫助來擴大堆區,因此看起來我們的程序占據的內存越來越多,盡管實際上程序可能并不需要那么多內存,僅僅是因為內存碎片的原因導致一部分內存無法被再次被利用起來。Kk328資訊網——每日最新資訊28at.com

然而對于現代操作系統尤其具備虛擬內存能力的系統來說,內存碎片問題通常可能并不會和我們想象的那樣嚴重,原因就在于分配的內存只需要在虛擬地址空間上連續而不必在物理內存上也連續,假定我們在虛擬內存地址空間需要存放“aabbccdd”這樣的字符串,在虛擬地址空間上看這是連續的就像這樣:Kk328資訊網——每日最新資訊28at.com

圖片圖片Kk328資訊網——每日最新資訊28at.com

但在物理內存上可能是這樣存放的:Kk328資訊網——每日最新資訊28at.com

圖片圖片Kk328資訊網——每日最新資訊28at.com

可以看到,利用虛擬內存我們可以更加充分靈活的利用“邊邊角角”的物理內存,從而減少內存碎片帶來的影響。Kk328資訊網——每日最新資訊28at.com

關于虛擬內存更詳細的講解你可以參考《深入理解操作系統》虛擬內存一章,關于公眾號“碼農的荒島求生”并回復“操作系統”即可。Kk328資訊網——每日最新資訊28at.com

如果你的程序需要重復申請很多對象/數據/結構體,并在最后一次性全部釋放,那么內存池是一個避免內存碎片不錯的選擇,原理在于盡管從內存池的角度看會有碎片,但當我們以內存池大小為單位從堆區中申請釋放內存時,這種碎片將不復存在。Kk328資訊網——每日最新資訊28at.com

Kk328資訊網——每日最新資訊28at.com

內存泄漏帶來的問題

在現代操作系統中除非你的程序運行時間足夠長或者申請的內存足夠快足夠多否則內存泄漏可能并不是什么大問題,你甚至可能都察覺不出來有內存泄漏,因為當進程運行結束后其占據的內存會被操作系統收回,在這種情況下你可能不必過于關心這個問題,但對于長時間運行的服務器端程序、數據庫程序、操作系統等,內存泄漏就屬于比較嚴重的問題了,因為這些程序必須時刻在線,任何微小的內存泄漏在時間的加持下都會非常明顯。Kk328資訊網——每日最新資訊28at.com

Kk328資訊網——每日最新資訊28at.com

內存持續泄漏會發生什么?

你的系統會慢到炸是有可能的。Kk328資訊網——每日最新資訊28at.com

內存的申請速度會對系統性能產生很大的影響,當系統內存不足時,內存分配器找到一塊滿足要求的空閑內存塊將更加困難耗時更多,當程序消耗的內存超過物理內存大小時虛擬內存系統(如果有的話)開始發揮作用,將進程地址空間中不常用的一部分swap出去,此時系統性能將快速下降,表現出來的就是程序員運行變慢、卡頓。Kk328資訊網——每日最新資訊28at.com

當然,根據系統配置,像Linux系統,可能會將消耗內存很多的進程kill掉,這就是Out of Memory killer,簡稱oom killer。Kk328資訊網——每日最新資訊28at.com

Kk328資訊網——每日最新資訊28at.com

內存泄漏檢測工具

內存泄漏問題通常比較難直接排查,尤其對于C/C++程序來說,這時我們將不得不借助必要的工具。Kk328資訊網——每日最新資訊28at.com

有一些專門的工具可以幫助你檢測內存泄漏,例如Valgrind、AddressSanitizer和MemorySanitizer。這些工具可以在運行時對程序進行檢查,識別出內存泄漏和其他內存錯誤。Kk328資訊網——每日最新資訊28at.com

此外針對特定的內存分配器,像jemalloc之類,這些內存分配器自帶內存檢測工具heap profile,能夠有效分析進程內存分配到了地方,并細化到函數級別,非常方便。Kk328資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-71449-0.html徹底理解內存泄漏,你學會了嗎?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Vue的緩存組件知道多少?實例代碼詳解KeepAlive

下一篇: 你真的了解package.json嗎?

標簽:
  • 熱門焦點
  • 鴻蒙OS 4.0公測機型公布:甚至連nova6都支持

    華為全新的HarmonyOS 4.0操作系統將于今天下午正式登場,官方在發布會之前也已經正式給出了可升級的機型產品,這意味著這些機型會率先支持升級享用。這次的HarmonyOS 4.0支持
  • 俄羅斯:將審查iPhone等外國公司設備 保數據安全

    iPhone和特斯拉都屬于在各自領域領頭羊的品牌,推出的產品也也都是數一數二的,但對于一些國家而言,它們的產品可靠性和安全性還是在限制范圍內。近日,俄羅斯聯邦通信、信息技術
  • 6月安卓手機性能榜:vivo/iQOO霸占旗艦排行榜前三

    2023年上半年已經正式過去了,我們也迎來了安兔兔V10版本,在新的驍龍8Gen3和天璣9300發布之前,性能榜的榜單大體會以驍龍8Gen2和天璣9200+為主,至于那顆3.36GHz的驍龍8Gen2領先
  • Raft算法:保障分布式系統共識的穩健之道

    1. 什么是Raft算法?Raft 是英文”Reliable、Replicated、Redundant、And Fault-Tolerant”(“可靠、可復制、可冗余、可容錯”)的首字母縮寫。Raft算法是一種用于在分布式系統
  • 如何正確使用:Has和:Nth-Last-Child

    我們可以用CSS檢查,以了解一組元素的數量是否小于或等于一個數字。例如,一個擁有三個或更多子項的grid。你可能會想,為什么需要這樣做呢?在某些情況下,一個組件或一個布局可能會
  • 企業采用CRM系統的11個好處

    客戶關系管理(CRM)軟件可以為企業提供很多的好處,從客戶保留到提高生產力。  CRM軟件用于企業收集客戶互動,以改善客戶體驗和滿意度。  CRM軟件市場規模如今超過580
  • 得物效率前端微應用推進過程與思考

    一、背景效率工程隨著業務的發展,組織規模的擴大,越來越多的企業開始意識到協作效率對于企業團隊的重要性,甚至是決定其在某個行業競爭中突圍的關鍵,是企業長久生存的根本。得物
  • 學習JavaScript的10個理由...

    作者 | Simplilearn編譯 | 王瑞平當你決心學習一門語言的時候,很難選擇到底應該學習哪一門,常用的語言有Python、Java、JavaScript、C/CPP、PHP、Swift、C#、Ruby、Objective-
  • 得物寵物生意「狂飆」,發力“它經濟”

    作者|花花小萌主近日,得物宣布正式上線寵物鑒別,通過得物App內的“在線鑒別”,可找到鑒別寵物的選項。通過上傳自家寵物的部位細節,就能收獲擁有專業資質認證的得物鑒
Top 主站蜘蛛池模板: 曲阳县| 民县| 永春县| 济阳县| 桃园市| 拜泉县| 松滋市| 全州县| 安义县| 石台县| 克拉玛依市| 会理县| 锡林郭勒盟| 东阳市| 班戈县| 台安县| 济南市| 寿光市| 玉树县| 鹤峰县| 通道| 勃利县| 松溪县| 重庆市| 六枝特区| 大宁县| 都安| 江达县| 长丰县| 延吉市| 慈溪市| 司法| 乌海市| 石嘴山市| 瓮安县| 乐安县| 清远市| 安福县| 阳春市| 临安市| 海原县|