成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

大家好,我是小風哥,今天和大家聊一聊內存泄漏這個話題。

在這些文章講到內存申請時我很喜歡用停車場來做類比,內存申請就好比去停車場找停車位,找到停車位后你就可以把車停在這里。

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

然而這其實是不全面的。

申請過多內存

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

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

內存無法刪除

另一類比較有趣的內存泄漏是說你申請了一些內存,但最終卻沒有什么指向它們:

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

在這段代碼中我們申請了1k內存,然而當memory_leak函數返回后你就再也不知道這段內存到底在哪里了!

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

內存碎片

這也算的上是一類特殊的內存泄漏,用停車場的例子來說就是兩個停車位中間停靠了一輛小型老年代步車,導致盡管這兩個停車位剩余的空間足夠大但又恰好都沒有辦法再??恳惠v小汽車。

假定我們系統中寶貴的內存大小只有8字節,其中有兩個字節已經分配出去了,就像這樣:

圖片圖片

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

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

然而對于現代操作系統尤其具備虛擬內存能力的系統來說,內存碎片問題通??赡懿⒉粫臀覀兿胂蟮哪菢訃乐兀蚓驮谟诜峙涞膬却嬷恍枰谔摂M地址空間上連續而不必在物理內存上也連續,假定我們在虛擬內存地址空間需要存放“aabbccdd”這樣的字符串,在虛擬地址空間上看這是連續的就像這樣:

圖片圖片

但在物理內存上可能是這樣存放的:

圖片圖片

可以看到,利用虛擬內存我們可以更加充分靈活的利用“邊邊角角”的物理內存,從而減少內存碎片帶來的影響。

關于虛擬內存更詳細的講解你可以參考《深入理解操作系統》虛擬內存一章,關于公眾號“碼農的荒島求生”并回復“操作系統”即可。

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

內存泄漏帶來的問題

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

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

你的系統會慢到炸是有可能的。

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

當然,根據系統配置,像Linux系統,可能會將消耗內存很多的進程kill掉,這就是Out of Memory killer,簡稱oom killer。

內存泄漏檢測工具

內存泄漏問題通常比較難直接排查,尤其對于C/C++程序來說,這時我們將不得不借助必要的工具。

有一些專門的工具可以幫助你檢測內存泄漏,例如Valgrind、AddressSanitizer和MemorySanitizer。這些工具可以在運行時對程序進行檢查,識別出內存泄漏和其他內存錯誤。

此外針對特定的內存分配器,像jemalloc之類,這些內存分配器自帶內存檢測工具heap profile,能夠有效分析進程內存分配到了地方,并細化到函數級別,非常方便。

責任編輯:武曉燕 來源: 碼農的荒島求生
相關推薦

2023-11-07 08:19:35

IO多路復用磁盤、

2023-01-31 08:02:18

2023-05-29 07:43:32

JVM內存調優

2023-08-01 12:51:18

WebGPT機器學習模型

2024-01-02 12:05:26

Java并發編程

2024-06-18 08:22:51

ActivityUI線程

2024-01-19 08:25:38

死鎖Java通信

2024-02-04 00:00:00

Effect數據組件

2023-07-26 13:11:21

ChatGPT平臺工具

2023-01-10 08:43:15

定義DDD架構

2024-11-13 11:12:08

JVM內存區域

2024-03-06 08:28:16

設計模式Java

2022-06-16 07:50:35

數據結構鏈表

2022-12-06 07:53:33

MySQL索引B+樹

2023-10-06 14:49:21

SentinelHystrixtimeout

2022-07-13 08:16:49

RocketMQRPC日志

2023-05-05 06:54:07

MySQL數據查詢

2023-03-26 22:31:29

2023-08-26 21:34:28

Spring源碼自定義

2023-06-26 13:08:52

GraphQL服務數據
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久尤物免费一区二区三区 | 久久中文字幕电影 | 日韩在线免费视频 | 99久久日韩精品免费热麻豆美女 | 亚洲精品久久久久久久久久久久久 | 四虎永久在线精品免费一区二 | 久久久久资源 | 一级片在线观看 | 国产精品99久久久久久久久久久久 | 中文字幕在线一区二区三区 | 欧美日韩高清一区二区三区 | 99久久久国产精品免费消防器 | 在线免费看黄 | 国产不卡一区 | 久久激情网 | 久久久久久亚洲精品不卡 | 人人澡人人射 | 一区二区三区中文字幕 | 久久av一区二区三区 | 免费不卡视频 | 国产视频一二三区 | 精品免费av | 国产成人99久久亚洲综合精品 | 亚洲免费在线观看 | 国产视频第一页 | 国产日韩欧美91 | 久久综合久久久 | av国产精品毛片一区二区小说 | 国产91在线播放 | 国产免费一区 | 日本a v在线播放 | 亚洲一区二区在线 | 国产亚洲精品久久午夜玫瑰园 | 精品三区 | 欧美久久久久久 | 九九久久在线看 | av色噜噜| 亚洲国产激情 | 欧美精品一区二区三区蜜桃视频 | 精品国产18久久久久久二百 | 97视频免费 |