記憶體釋放

所謂記憶體釋放,就是將駐留在記憶體中的數據從記憶體中釋放出來,以提高系統記憶體資源的利用率,進而提升系統性能。 在C++中,記憶體分成5個區,他們分別是堆、棧、自由存儲區、全局/靜態存儲區和常量存儲區。記憶體中,堆和棧的區別:1、管理方式不同; 2、空間大小不同; 3、能否產生碎片不同; 4、生長方向不同; 5、分配方式不同; 6、分配效率不同。

基本介紹

  • 中文名:記憶體釋放
  • 解釋:數據從記憶體中釋放出來
  • 提高系統記憶體資源的利用率
  • 提升:系統性能
電腦記憶體釋放,手機記憶體釋放,套用軟體,記憶體分配,

電腦記憶體釋放

推薦方法:
1. 第一步: 在桌面上點擊右鍵建立一個文本文檔;
第二步: 在此文本文檔中編輯Mystart=space(50000000)
第三步:保存此文檔檔案名稱為“xxx.vbs”,xxx為你自己所命名的文檔名,關鍵是後綴為.vbs
第四步:保存類型為“所有檔案”,保存文檔桌面上。
2. 第一步:打開 註冊表[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
下,刪除不必要的開機啟動項。例如:kugoo、3721、qq、dudu加速、realone、msn 等。
第二步:控制臺-管理工具-服務 禁用 掉沒有必要的windows服務 例如:windows自帶刻錄功能、messenger、net logon、auto update、Wireless Zero Configuration、Computer Browse;
第三步:到c:\windows下找Prefetch資料夾,將其下的所有檔案全部刪除;
第四步:減少桌面圖示,儘量從 開始-程式 中啟動軟體。或在桌面建立 資料夾 將圖示分類移入,啟動時先打開資料夾。
第五步:開始 -附屬檔案-系統工具-碎片整理。進行碎片整理;
第六步:我的電腦-屬性-高級 第一個 設定 ,選擇調整為最佳性能 。

手機記憶體釋放

目前還沒有完全可靠的手機記憶體整理軟體,一般手機和智慧型手機可以通過格式化記憶體卡、作業系統(塞班、WindowsPC等)等方法來釋放記憶體,提高開機速度。

套用軟體

常用的計算機記憶體整理軟體包括 記憶體釋放專家超級兔子、Windows最佳化大師、360安全衛士等,部分防毒軟體也配備了記憶體整理功能。

記憶體分配

五大記憶體分區
在C++中,記憶體分成5個區,他們分別是堆、棧、自由存儲區、全局/靜態存儲區和常量存儲區。
棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清除的變數的存儲區。裡面的變數通常是局部變數、函式參數等。
堆,就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般一個new就要對應一個delete。如果程式設計師沒有釋放掉,那么在程式結束後,作業系統會自動回收。
自由存儲區,就是那些由malloc等分配的記憶體塊,他和堆是十分相似的,不過它是用free來結束自己的生命的。
全局/靜態存儲區,全局變數靜態變數被分配到同一塊記憶體中,在以前的C語言中,全局變數又分為初始化的和未初始化的,在C++裡面沒有這個區分了,他們共同占用同一塊記憶體區。
常量存儲區,這是一塊比較特殊的存儲區,他們裡面存放的是常量,不允許修改(當然,你要通過非正當手段也可以修改,而且方法很多)
記憶體中,堆和棧的區別
初學記憶體的時候,免不了對堆和棧的學習了解。很多初學者對這一問題都很敏感!甚至一些“老手”對這一問題也有一些疑問。搞清楚堆區和棧區的區別,是我們學習,了解記憶體並進一步套用的必經階段!
主要的區別由以下幾點:
1、管理方式不同;
2、空間大小不同;
3、能否產生碎片不同;
4、生長方向不同;
5、分配方式不同;
6、分配效率不同;
管理方式:對於棧來講,是由編譯器自動管理,無需我們手工控制;對於堆來說,釋放工作由程式設計師控制,容易產生memory leak。
空間大小:一般來講在32位系統下,堆記憶體可以達到4G的空間,從這個角度來看堆記憶體幾乎是沒有什麼限制的。但是對於棧來講,一般都是有一定的空間大小的,例如,在VC6下面,默認的棧空間大小是1M(好像是,記不清楚了)。當然,我們可以修改:
打開工程,依次操作選單如下:Project->Setting->Link,在Category 中選中Output,然後在Reserve中設定堆疊的最大值和commit。
注意:reserve最小值為4Byte;commit是保留在虛擬記憶體的頁檔案裡面,它設定的較大會使棧開闢較大的值,可能增加記憶體的開銷和啟動時間。
碎片問題:對於堆來講,頻繁的new/delete勢必會造成記憶體空間的不連續,從而造成大量的碎片,使程式效率降低。對於棧來講,則不會存在這個問題,因為棧是先進後出的佇列,他們是如此的一一對應,以至於永遠都不可能有一個記憶體塊從棧中間彈出,在他彈出之前,在他上面的後進的棧內容已經被彈出,詳細的可以參考數據結構,這裡我們就不再一一討論了。
生長方向:對於堆來講,生長方向是向上的,也就是向著記憶體地址增加的方向;對於棧來講,它的生長方向是向下的,是向著記憶體地址減小的方向增長。
分配方式:堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,比如局部變數的分配。動態分配由alloca函式進行分配,但是棧的動態分配和堆是不同的,他的動態分配是由編譯器進行釋放,無需我們手工實現。
分配效率:棧是機器系統提供的數據結構,計算機會在底層對棧提供支持:分配專門的暫存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。堆則是C/C++函式館提供的,它的機制是很複雜的,例如為了分配一塊記憶體,庫函式會按照一定的算法(具體的算法可以參考數據結構/作業系統)在堆記憶體中搜尋可用的足夠大小的空間,如果沒有足夠大小的空間(可能是由於記憶體碎片太多),就有可能調用系統功能去增加程式數據段的記憶體空間,這樣就有機會分到足夠大小的記憶體,然後進行返回。顯然,堆的效率比棧要低得多。
從這裡我們可以看到,堆和棧相比,由於大量new/delete的使用,容易造成大量的記憶體碎片;由於沒有專門的系統支持,效率很低;由於可能引發用戶態和核心態的切換,記憶體的申請,代價變得更加昂貴。所以棧在程式中是套用最廣泛的,就算是函式的調用也利用棧去完成,函式調用過程中的參數,返回地址,EBP和局部變數都採用棧的方式存放。所以,我們推薦大家儘量用棧,而不是用堆。
雖然棧有如此眾多的好處,但是由於和堆相比不是那么靈活,有時候分配大量的記憶體空間,還是用堆好一些。
無論是堆還是棧,都要防止越界現象的發生(除非你是故意使其越界),因為越界的結果要么是程式崩潰,要么是摧毀程式的堆、棧結構,產生以想不到的結果,就算是在你的程式運行過程中,沒有發生上面的問題,你還是要小心,說不定什麼時候就崩掉,那時候debug可是相當困難的!
因此,在構建程式的時候防止越界現象的發生,讓你的程式更健康!

相關詞條

熱門詞條

聯絡我們