『壹』 現網伺服器突然報內存異出,怎麼處理
如何優化內存的管理,提高內存的使用效率,盡可能地提高運行速度,是我們所關心的問題。下面介紹在Windows操作系統中,提高內存的使用效率和優化內存管理的幾種方法。
1.改變頁面文件的位置
其目的主要是為了保持虛擬內存的連續性。因為硬碟讀取數據是靠磁頭在磁性物質上讀取,頁面文件放在磁碟上的不同區域,磁頭就要跳來跳去,自然不利於提高效率。
而且系統盤文件眾多,虛擬內存肯定不連續,因此要將其放到其他盤上。改變頁面文件位置的方法是:用滑鼠右鍵點擊「我的電腦」,選擇「屬性→高級→性能設置→高級→更改虛擬內存」,在驅動器欄里選擇想要改變到的位置即可。
值得注意的是,當移動好頁面文件後,要將原來的文件刪除(系統不會自動刪除)。
2.改變頁面文件的大小
改變了頁面文件的位置後,我們還可以對它的大小進行一些調整。調整時我們需要注意,不要將最大、最小頁面文件設為等值。因為通常內存不會真正「塞滿」,它會在內存儲量到達一定程度時,自動將一部分暫時不用的數據放到硬碟中。最小頁面文件越大,所佔比例就低,執行的速度也就越慢。最大頁面文件是極限值,有時打開很多程序,內存和最小頁面文件都已「塞滿」,就會自動溢出到最大頁面文件。
所以將兩者設為等值是不合理的。一般情況下,最小頁面文件設得小些,這樣能在內存中盡可能存儲更多數據,效率就越高。最大頁面文件設得大些,以免出現「滿員」的情況。
3.禁用頁面文件
當擁有了512MB以上的內存時,頁面文件的作用將不再明顯,因此我們可以將其禁用。方法是:依次進入注冊表編輯器「HKEY_LOCAL_ Ma-nagerMemoryManagement」下,在「DisablePa-ging Executive」(禁用頁面文件)選項中將其值設為「1」即可。
4.清空頁面文件
在同一位置上有一個「ClearPageFileAtShutdown(關機時清除頁面文件)」,將該值設為「1」。這里所說的「清除」頁面文件並非是指從硬碟上完全刪除pagefile.sys文件,而是對其進行「清洗」和整理,從而為下次啟動Windows XP時更好地利用虛擬內存做好准備。
5.調整高速緩存區域的大小
可以在「計算機的主要用途」選項卡中設置系統利用高速緩存的比例(針對Windows 98)。如果系統的內存較多,可選擇「網路伺服器」,這樣系統將用較多的內存作為高速緩存。在CD-ROM標簽中,可以直接調節系統用多少內存作為CD-ROM光碟讀寫的高速緩存。
6.監視內存
系統的內存不管有多大,總是會用完的。雖然有虛擬內存,但由於硬碟的讀寫速度無法與內存的速度相比,所以在使用內存時,就要時刻監視內存的使用情況。Windows操作系統中提供了一個系統監視器,可以監視內存的使用情況。一般如果只有60%的內存資源可用,這時你就要注意調整內存了,不然就會嚴重影響電腦的運行速度和系統性能。
7.及時釋放內存空間
如果你發現系統的內存不多了,就要注意釋放內存。所謂釋放內存,就是將駐留在內存中的數據從內存中釋放出來。釋放內存最簡單有效的方法,就是重新啟動計算機。
另外,就是關閉暫時不用的程序。還有要注意剪貼板中如果存儲了圖像資料,是要佔用大量內存空間的。這時只要剪貼幾個字,就可以把內存中剪貼板上原有的圖片沖掉,從而將它所佔用的大量的內存釋放出來。
8.優化內存中的數據
在Windows中,駐留內存中的數據越多,就越要佔用內存資源。所以,桌面上和任務欄中的快捷圖標不要設置得太多。如果內存資源較為緊張,可以考慮盡量少用各種後台駐留的程序。平時在操作電腦時,不要打開太多的文件或窗口。
長時間地使用計算機後,如果沒有重新啟動計算機,內存中的數據排列就有可能因為比較混亂,從而導致系統性能的下降。這時你就要考慮重新啟動計算機。
9.提高系統其他部件的性能
計算機其他部件的性能對內存的使用也有較大的影響,如匯流排類型、CPU、硬碟和顯存等。如果顯存太小,而顯示的數據量很大,再多的內存也是不可能提高其運行速度和系統效率的。如果硬碟的速度太慢,則會嚴重影響整個系統的工作。
『貳』 內存溢出和內存泄漏的區別,產生原因以及解決方案
內存溢出 out of memory,是指程序在申請內存時,沒有足夠的內存空間供其使用,出現out of memory;比如申請了一個integer,但給它存了long才能存下的數,那就是內存溢出。
內存泄露 memory leak,是指程序在申請內存後,無法釋放已申請的內存空間,一次內存泄露危害可以忽略,但內存泄露堆積後果很嚴重,無論多少內存,遲早會被佔光。
memory leak會最終會導致out of memory!
內存溢出就是你要求分配的內存超出了系統能給你的,系統不能滿足需求,於是產生溢出。
內存泄漏是指你向系統申請分配內存進行使用(new),可是使用完了以後卻不歸還(delete),結果你申請到的那塊內存你自己也不能再訪問(也許你把它的地址給弄丟了),而系統也不能再次將它分配給需要的程序。一個盤子用盡各種方法只能裝4個果子,你裝了5個,結果掉倒地上不能吃了。這就是溢出!比方說棧,棧滿時再做進棧必定產生空間溢出,叫上溢,棧空時再做退棧也產生空間溢出,稱為下溢。就是分配的內存不足以放下數據項序列,稱為內存溢出.
以發生的方式來分類,內存泄漏可以分為4類:
1. 常發性內存泄漏。發生內存泄漏的代碼會被多次執行到,每次被執行的時候都會導致一塊內存泄漏。
2. 偶發性內存泄漏。發生內存泄漏的代碼只有在某些特定環境或操作過程下才會發生。常發性和偶發性是相對的。對於特定的環境,偶發性的也許就變成了常發性的。所以測試環境和測試方法對檢測內存泄漏至關重要。
3. 一次性內存泄漏。發生內存泄漏的代碼只會被執行一次,或者由於演算法上的缺陷,導致總會有一塊僅且一塊內存發生泄漏。比如,在類的構造函數中分配內存,在析構函數中卻沒有釋放該內存,所以內存泄漏只會發生一次。
4. 隱式內存泄漏。程序在運行過程中不停的分配內存,但是直到結束的時候才釋放內存。嚴格的說這里並沒有發生內存泄漏,因為最終程序釋放了所有申請的內存。但是對於一個伺服器程序,需要運行幾天,幾周甚至幾個月,不及時釋放內存也可能導致最終耗盡系統的所有內存。所以,我們稱這類內存泄漏為隱式內存泄漏。
從用戶使用程序的角度來看,內存泄漏本身不會產生什麼危害,作為一般的用戶,根本感覺不到內存泄漏的存在。真正有危害的是內存泄漏的堆積,這會最終消耗盡系統所有的內存。從這個角度來說,一次性內存泄漏並沒有什麼危害,因為它不會堆積,而隱式內存泄漏危害性則非常大,因為較之於常發性和偶發性內存泄漏它更難被檢測到
內存溢出的原因以及解決方法
引起內存溢出的原因有很多種,小編列舉一下常見的有以下幾種:
1.內存中載入的數據量過於龐大,如一次從資料庫取出過多數據;
2.集合類中有對對象的引用,使用完後未清空,使得JVM不能回收;
3.代碼中存在死循環或循環產生過多重復的對象實體;
4.使用的第三方軟體中的BUG;
5.啟動參數內存值設定的過小
內存溢出的解決方案:
第一步,修改JVM啟動參數,直接增加內存。(-Xms,-Xmx參數一定不要忘記加。)
第二步,檢查錯誤日誌,查看「OutOfMemory」錯誤前是否有其它異常或錯誤。
第三步,對代碼進行走查和分析,找出可能發生內存溢出的位置。
重點排查以下幾點:
1.檢查對資料庫查詢中,是否有一次獲得全部數據的查詢。一般來說,如果一次取十萬條記錄到內存,就可能引起內存溢出。這個問題比較隱蔽,在上線前,資料庫中數據較少,不容易出問題,上線後,資料庫中數據多了,一次查詢就有可能引起內存溢出。因此對於資料庫查詢盡量採用分頁的方式查詢。
2.檢查代碼中是否有死循環或遞歸調用。
3.檢查是否有大循環重復產生新對象實體。
4.檢查對資料庫查詢中,是否有一次獲得全部數據的查詢。一般來說,如果一次取十萬條記錄到內存,就可能引起內存溢出。這個問題比較隱蔽,在上線前,資料庫中數據較少,不容易出問題,上線後,資料庫中數據多了,一次查詢就有可能引起內存溢出。因此對於資料庫查詢盡量採用分頁的方式查詢。
5.檢查List、MAP等集合對象是否有使用完後,未清除的問題。List、MAP等集合對象會始終存有對對象的引用,使得這些對象不能被GC回收。
第四步,使用內存查看工具動態查看內存使用情況