內存溢出,內存泄漏,CPU溢出區別


內存溢出 out of memory就是你要的內存空間超過了系統實際分配給你的空間,此時系統相當於沒法滿足你的需求,就會報內存溢出的錯誤

內存泄漏是指你向系統申請分配內存進行使用(new),可是使用完了以后卻不歸還(delete),結果你申請到的那塊內存你自己也不能再訪問(也許你把它的地址給弄丟了),而系統也不能再次將它分配給需要的程序。一個盤子用盡各種方法只能裝4個果子,你裝了5個,結果掉倒地上不能吃了。這就是溢出!比方說棧,棧滿時再做進棧必定產生空間溢出,叫上溢,棧空時再做退棧也產生空間溢出,稱為下溢。就是分配的內存不足以放下數據項序列,稱為內存溢出

 

內存泄露 memory leak內存泄漏是指你向系統申請分配內存進行使用(new),可是使用完了以后卻不歸還(delete),結果你申請到的那塊內存你自己也不能再訪問(也許你把它的地址給弄丟了),而系統也不能再次將它分配給需要的程序

內存泄漏可以分為4類: 
1. 常發性內存泄漏。發生內存泄漏的代碼會被多次執行到,每次被執行的時候都會導致一塊內存泄漏。 
2. 偶發性內存泄漏。發生內存泄漏的代碼只有在某些特定環境或操作過程下才會發生。常發性和偶發性是相對的。對於特定的環境,偶發性的也許就變成了常發性的。所以測試環境和測試方法對檢測內存泄漏至關重要。 
3. 一次性內存泄漏。發生內存泄漏的代碼只會被執行一次,或者由於算法上的缺陷,導致總會有一塊僅且一塊內存發生泄漏。比如,在類的構造函數中分配內存,在析構函數中卻沒有釋放該內存,所以內存泄漏只會發生一次。 
4. 隱式內存泄漏。程序在運行過程中不停的分配內存,但是直到結束的時候才釋放內存。嚴格的說這里並沒有發生內存泄漏,因為最終程序釋放了所有申請的內存。但是對於一個服務器程序,需要運行幾天,幾周甚至幾個月,不及時釋放內存也可能導致最終耗盡系統的所有內存。所以,我們稱這類內存泄漏為隱式內存泄漏。 

內存溢出原因: 
1.內存中加載的數據量過於龐大,如一次從數據庫取出過多數據; 
2.集合類中有對對象的引用,使用完后未清空,使得JVM不能回收; 
3.代碼中存在死循環或循環產生過多重復的對象實體; 
4.使用的第三方軟件中的BUG 
5.啟動參數內存值設定的過小
內存溢出的解決方案: 
第一步,修改JVM啟動參數,直接增加內存。(-Xms-Xmx參數一定不要忘記加。)
第二步,檢查錯誤日志,查看OutOfMemory”錯誤前是否有其 它異常或錯誤。

第三步,對代碼進行走查和分析,找出可能發生內存溢出的位置。

內存泄露是指程序在運行過程中動態申請的內存空間不再使用后沒有及時釋放,從而很可能導致應用程序內存無線增長。更廣義的內存泄露包括未對系統的資源的及時釋放,比如句柄等。

內存溢出即用戶在對其數據緩沖區操作時,超過了其緩沖區的邊界;尤其是對緩沖區寫操作時,緩沖區的溢出很可能導致程序的異常。

Cpu溢出:

CPU過載、內存溢出問題一般出現在線上項目中,因為開發環境用戶量和數據量都很小,即使你的代碼有問題也不會爆發出來

原因:造成這樣問題有兩個大類型的原因:

一,性能問題,高並發高訪問情況下線程太多,內存不夠用;

二,代碼問題,如代碼中有死循環、一次查詢數據量太大、存在太多對象引用內存無法回收,數據庫死鎖等。

解決方案:

服務器性能瓶頸,可升級服務器CPU核心數,加大CPU內存,或采用集群方案,使用nginx做負載均衡,keepalivednginx的雙機熱備


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM