看片91_日日综合_成人黄色短视频在线观看_91视频 - v11=Av_国产高潮失禁喷水爽到抽搐视频_天天都色视频

如何有效進行內存分配和釋放(電腦的空間如何分配)

小編:迷魂冰 更新時間:2022-10-28 15:51

引言

內存泄漏(Memory Leak)是指程序中已動態分配堆內存由于某種原因程序未釋放或無法釋放,造成系統內存的浪費,導致程序運行速度減慢甚至系統崩潰嚴重后果

內存泄漏缺陷具有隱蔽性、積累性的特征,比其他內存非法訪問錯誤更難檢測;因為內存泄漏的產生原因是內存塊未被釋放,屬于遺漏型缺陷而不是過錯型缺陷;內存泄漏通常不會直接產生可觀察的錯誤癥狀,而是逐漸積累,降低系統整體性能,極端的情況下可能使系統崩潰

如何有效進行內存分配和釋放(電腦的空間如何分配)

隨著計算機應用需求的日益增加,應用程序的設計與開發也相應的日趨復雜,開發人員在程序實現的過程中處理的變量也大量增加,如何有效進行內存分配和釋放,防止內存泄漏的問題變得越來越突出

例如:服務器應用軟件,需要長時間的運行,不斷的處理由客戶端發來的請求,如果沒有有效的內存管理,每處理一次請求信息就有一定的內存泄漏;這樣不僅影響到服務器的性能,還可能造成整個系統的崩潰。因此,內存管理成為軟件設計開發人員在設計中考慮的主要方面

內存泄漏的原因

從變量存在的時間生命周期的角度上,把變量分為靜態存儲變量和動態存儲變量兩類;靜態存儲變量是指在程序運行期間分配了固定存儲空間的變量。動態存儲變量是指在程序運行期間根據實際需要進行動態地分配存儲空間的變量

程序中所用的數據分別存放在靜態存儲區和動態存儲區中;靜態存儲區數據在程序的開始就分配好內存區,在整個程序執行過程中它們所占的存儲單元是固定的,在程序結束時就釋放,因此靜態存儲區數據一般為全局變量

動態存儲區數據則是在程序執行過程中根據需要動態分配和動態釋放的存儲單元,動態存儲區數據有三類函數形參變量、局部變量和函數調用時的現場保護與返回地址;由于動態存儲變量可以根據函數調用的需要,動態地分配和釋放存儲空間,大大提高了內存的使用效率,使得動態存儲變量在程序中被廣泛使用。

開發人員進行程序開發的過程使用動態存儲變量時,不可避免地面對內存管理的問題。程序中動態分配的存儲空間,在程序執行完畢后需要進行釋放。沒有釋放動態分配的存儲空間而造成內存泄漏,是使用動態存儲變量的主要問題。一般情況下,開發人員使用系統提供的內存管理基本函數,如 malloc 、 recalloc 、 calloc 、 free 等,完成動態存儲變量存儲空間的分配和釋放

但是,當開發程序中使用動態存儲變量較多和頻繁使用函數調用時,就會經常發生內存管理錯誤

例如:

分配一個內存塊并使用其中未經初始化的內容;

釋放一個內存塊,但繼續引用其中的內容;

子函數中分配的內存空間在主函數出現異常中斷時、或主函數對子函數返回的信息使用結束時,沒有對分配的內存進行釋放;

程序實現過程中分配的臨時內存在程序結束時,沒有釋放臨時內存。內存錯誤一般是不可再現的,開發人員不易在程序調試和測試階段發現,即使花費了很多精力和時間,也無法徹底消除

如何有效進行內存分配和釋放(電腦的空間如何分配)

內存泄漏通常分為一下四類

1)常發性內存泄漏

發生內存泄漏的代碼會被多次執行,每行一次執行都會導致一塊內存泄漏

2)偶發性內存泄漏

發生內存泄漏的代碼只在某些特定的環境或操作中才會發生,常發性和偶發性是相對的,在特定的環境下,偶發性內存泄漏也許就變成了常發性

3)一次性內存泄漏

發生內存泄漏的代碼只被執行一次

4)隱式內存泄漏

程序在運行過程中不停的分配內存,但直到結束時才釋放內存,嚴格的說,并沒有發生內存泄漏,因為程序最終釋放了內存,但是在服務器上一個程序,通常運行時間長,不及時釋放內存也可能導致內存耗盡;這類被稱為隱式內存泄漏

如何有效進行內存分配和釋放(電腦的空間如何分配)

內存分配策略

程序運行時的內存分配策略有三種,分別是靜態分配,棧式分配,和堆式分配,對應的,三種存儲策略使用的內存空間主要分別是靜態存儲區(也稱方法區)、棧區和堆區

靜態存儲區(方法區)

主要存放靜態數據、全局 static 數據和常量;這塊內存在程序編譯時就已經分配好,并且在程序整個運行期間都存在

棧區

當方法被執行時,方法體內的局部變量(其中包括基礎數據類型、對象的引用)都在棧上創建,并在方法執行結束時這些局部變量所持有的內存將會自動被釋放;因為棧內存分配運算內置于處理器的指令集中,效率很高,但是分配的內存容量有限

堆區

又稱動態內存分配,通常就是指在程序運行時直接 new 出來的內存,也就是對象的實例;這部分內存在不使用時將會由 垃圾回收器來負責回收

棧與堆的區別

在方法體內定義的(局部變量)一些基本類型的變量和對象的引用變量都是在方法的棧內存中分配的

當在一段方法塊中定義一個變量時,Java 就會在棧中為該變量分配內存空間,當超過該變量的作用域后,該變量也就無效了,分配給它的內存空間也將被釋放掉,該內存空間可以被重新使用

堆內存用來存放所有由 new 創建的對象(包括該對象其中的所有成員變量)和數組

在堆中分配的內存,將由垃圾回收器來自動管理;在堆中產生了一個數組或者對象后,還可以在棧中定義一個特殊的變量,這個變量的取值等于數組或者對象在堆內存中的首地址,這個特殊的變量就是我們上面說的引用變量;我們可以通過這個引用變量來訪問堆中的對象或者數組

舉個例子

publicclassSample{ ints1 = 0; Sample mSample1 = newSample(); publicvoidmethod(){ ints2 = 1; Sample mSample2 = newSample(); Sample mSample3 = newSample(); }

Sample 類的局部變量 s2 和引用變量 mSample2 都是存在于棧中,但 mSample2 指向的對象是存在于堆上的; mSample3 指向的對象實體存放在堆上,包括這個對象的所有成員變量 s1 和 mSample1,而它自己存在于棧中

結論

局部變量的基本數據類型和引用存儲于棧中,引用的對象實體存儲于堆中;因為它們屬于方法中的變量,生命周期隨方法而結束

成員變量全部存儲與堆中(包括基本數據類型,引用和引用的對象實體)—— 因為它們屬于類,類對象終究是要被 new 出來使用的

寫到這里你就不難看出現在作為一名程序員,那么就免不了要和 Linux 產生一定的聯系,因此我也建議大家要學習一下 Linux

學 Linux 最好地方式,就是直接去用!直接將自己的開發環境都改成 linux,一開始很蹩腳,很不適應,這很正常。如果你一直感到很舒服,只能說明你一直沒有進步。想想我們學了那么多年英語,絕大多數人還是無法掌握英語,看到英語文檔就直接自動屏蔽。其原因都是:一直在學,但從來沒在用;只學而不用,沒有半點用

在這里提供一份 Linux 全套學習手冊:可以私信發送“學習” 即可 免費獲取

如何有效進行內存分配和釋放(電腦的空間如何分配)如何有效進行內存分配和釋放(電腦的空間如何分配)
主站蜘蛛池模板: 一区二视频 | 精品一区二区三区久久 | 国产日韩亚洲欧美 | 婷婷综合五月天 | 91精品国产亚洲 | 欧美视频一 | 国产性av | 国产999精品久久久 99re这里只有精品在线 | 男女免费网站 | 国产亚洲综合性久久久影院 | 国产在线拍| 99视频在线播放 | 亚洲网站在线观看 | 欧美一区二区三区在线观看视频 | 成人爽a毛片免费啪啪动漫 久久久国产一区二区三区 国产69久久精品成人看 | 久国久产久精永久网页 | 一区二区三区四区视频在线 | 九九成人| 亚洲成av人影片在线观看 | 久久精品中文 | 久久免费观看少妇a级毛片 亚洲成人一区二区 | 久久国产精品一区二区三区 | 精品国产乱 | 青青草欧美 | 曰本毛片 | 国产一区二区视频在线播放 | 九九热视频在线播放 | 日本不卡一区二区三区在线观看 | 99re热精品| 欧美视频自拍偷拍 | 国产精品视频999 | 二区在线观看 | 国产视频在线免费观看 | 在线观看成人网 | 亚洲一区二区久久 | 日韩精品一区二区三区中文字幕 | 亚洲国产精品一区二区久久,亚洲午夜 | 日本视频在线播放 | 不卡精品 | 国产最新精品视频 | 日韩一区二区在线免费观看 |