內存溢出和內存泄漏的區別

對於項目的內存和cpu使用需要做測試,

先分析內存溢出和內存泄漏的概念。

概念

內存溢出(out of memory):簡單講就是 項目所需要的內存大於虛擬機提供的內存,導致內存溢出。

                     複雜一點就是由於應用中無法回收的內存和內存使用過多,導致最終項目運行所需內存大於虛擬機的內存(其實聽說溢出有上溢和下溢,這裏不做討論)。

內存泄漏(memory leak):簡單講就是 由於項目出現了無用,但是GC又無法回收的對象,導致內存泄露,最後導致使用內存逐漸增大。(無用,無法回收)

                   複雜一點就是由於你申請分配內存(new),用完了後沒有歸還(delete),結果你申請的內存無法再次訪問,也無法被程序再次使用,隨着服務器的內存不斷消耗,無法使用的內存越來越多,產生泄漏。

關聯:

內存泄漏越來越多,最後導致內存溢出。

導致原因:

內存溢出:

內存中加載的數據量過於龐大,如一次從數據庫取出過多數據;
集合類中有對對象的引用,使用完後未清空,使得JVM不能回收;
代碼中存在死循環或循環產生過多重複的對象實體;
使用的第三方軟件中的BUG;
啓動參數內存值設定的過小;

★總體上來說,產生內存溢出是由於代碼寫的不好造成的,因此提高代碼的質量是最根本的解決辦法。

例:你聲明一個integer,但是去存取了一個long類型的數

內存泄露:

數據庫流未關閉

引用對象未設置空

聲明時候多用static

死循環等......

★總體來說,產生內存泄漏是因爲對象不再用,但是又被其他對象應用,GC無法回收

例:循環遍歷一個Object,並把它add到一個對象中,Object不再使用,但是GC無法回收

解決方法:

1 、儘早釋放無用對象的引用。好的辦法是使用臨時變量的時候,讓引用變量在退出活動域後,自動設置爲 null ,暗示垃圾收集器來收集該對象,防止發生內存泄露。
       對於仍然有指針指向的實例, jvm 就不會回收該資源 , 因爲垃圾回收會將值爲 null 的對象作爲垃圾,提高 GC 回收機制效率;
2 、我們的程序裏不可避免大量使用字符串處理,避免使用 String ,應大量使用 StringBuffer ,每一個 String 對象都得獨立佔用內存一塊區域;

3 、儘量減少變量和對象的作用範圍,不聲明static的就不聲明。

GC原理:

   GC(Garbage Collection)是java的垃圾回收,GC算法沒去琢磨過,但是它是依照:回收那些不再被引用的對象內存的過程。一般我們認爲正在被引用的對象狀態爲“alive”,而沒有被應用或者取不到引用屬性的對象狀態爲“dead”。垃圾回收是一個釋放處於”dead”狀態的對象的內存的過程。而垃圾回收的規則和算法被動態的作用於應用運行當中,自動回收。

   當程序對象處於不使用,但是又被另外一個對象引用着,那麼GC就不會回收,就會導致內存泄漏   

---------------我是分割線--------------------------

轉載請說明出處:http://blog.csdn.net/todaymz/article/details/8719814


補充:

http://www.cnblogs.com/eggbucket/archive/2012/09/24/2699574.html(內存溢出3種報錯)

http://blog.csdn.net/mrmaomaochong/article/details/6014869(內存溢出詳解)

http://blog.csdn.net/ousyuryu/article/details/6132288(內存溢出和GC分析)

http://blog.csdn.net/buutterfly/article/details/6617375(內存泄漏分類詳解)

    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章