• <em id="6vhwh"><rt id="6vhwh"></rt></em>

    <style id="6vhwh"></style>

    <style id="6vhwh"></style>
    1. <style id="6vhwh"></style>
        <sub id="6vhwh"><p id="6vhwh"></p></sub>
        <p id="6vhwh"></p>
          1. 国产亚洲欧洲av综合一区二区三区 ,色爱综合另类图片av,亚洲av免费成人在线,久久热在线视频精品视频,成在人线av无码免费,国产精品一区二区久久毛片,亚洲精品成人片在线观看精品字幕 ,久久亚洲精品成人av秋霞

            內存泄露(內存泄露檢測工具)

            更新時間:2023-02-28 21:33:25 閱讀: 評論:0

            什么是內存泄漏

            指因為疏忽或錯誤造成程序未能釋放已經不再使用的內存的情況。內存泄漏并不是指內存在物理上的消失,而是應用程序分配某段內存后,因為設計錯誤,失去了對該段內存的控制,因而造成了內存的浪費。
            根據發生的方式來進行分類的話,內存泄漏可以分為4類:
            1.常發性內存泄漏:發生內存泄漏的代碼會被多次執行到,每次執行都會導致一塊內存的泄漏。
            2.偶發性內存泄漏:發生內存泄漏的代碼只有在特定的環境或者操作過程下才會發生。 常發性和偶發性是相對的。 對于特定的環境,偶發性的也就編程常發性的。所以測試環境和測試方法對檢測內存泄漏至關重要。
            3.一次性內存泄漏:發生內存泄漏的代碼只會被執行一次,或者由于算法上的缺陷,導致總會有一塊且僅有一塊內存發生泄漏。比如在類的構建函數中分配內存,在析構函數中卻沒有釋放該內存,所以內存泄漏只會發生一次。
            4.隱士內存泄漏:程序運行過程中不停的分配內存,直到程序結束才能夠釋放內存。嚴格的說這并沒有發生內存泄漏,因為程序最終釋放了所申請的內存。但是對于一個服務器程序,可能需要運行 幾天,幾周,幾月,甚至幾年。如果不及時的釋放內存,系統的內存資源最終都會被消耗完。so我們稱這種的為隱士的內存泄漏。
            對于用戶來說內存泄漏沒什么影響,因為他們并不在乎。而且一般的用戶根本也感受不到這個東西。真正有害的是內存泄漏的堆積,因為這最終會消耗盡所有的系統資源。 從這個角度來說的話,一次性內存泄漏,其實并沒有什么危害,因為他不會大量的堆積。而隱式內存泄漏則危害最大。因為較之于常發性或偶發性的內存泄漏。他更加的難以被發現。

            什么是內存泄漏?

            內存泄漏
            內存泄漏也稱作"存儲滲漏",用動態存儲分配函數動態開辟的空間,在使用完畢后未釋放,結果導致一直占據該內存單元。直到程序結束。(其實說白了就是該內存空間使用完畢之后未回收)即所謂內存泄漏。
            內存泄漏形象的比喻是"操作系統可提供給所有進程的存儲空間正在被某個進程榨干",最終結果是程序運行時間越長,占用存儲空間越來越多,最終用盡全部存儲空間,整個系統崩潰。所以"內存泄漏"是從操作系統的角度來看的。這里的存儲空間并不是指物理內存,而是指虛擬內存大小,這個虛擬內存大小取決于磁盤交換區設定的大小。由程序申請的一塊內存,如果沒有任何一個指針指向它,那么這塊內存就泄漏了。

            什么是內存泄漏

            內存泄漏的定義

            一般我們常說的內存泄漏是指堆內存的泄漏。堆內存是指程序從堆中分配的,大小任意的(內存塊的大小可以在程序運行期決定),使用完后必須顯示釋放的內存。應用程序一般使用malloc,realloc,new等函數從堆中分配到一塊內存,使用完后,程序必須負責相應的調用free或delete釋放該內存塊,否則,這塊內存就不能被再次使用,我們就說這塊內存泄漏了。以下這段小程序演示了堆內存發生泄漏的情形:

            void MyFunction(int nSize)

            {

            char* p= new char[nSize];

            if( !GetStringFrom( p, nSize ) ){

            MessageBox(“Error”);

            return;

            }

            …//using the string pointed by p;

            delete p;

            }
            例一

            當函數GetStringFrom()返回零的時候,指針p指向的內存就不會被釋放。這是一種常見的發生內存泄漏的情形。程序在入口處分配內存,在出口處釋放內存,但是c函數可以在任何地方退出,所以一旦有某個出口處沒有釋放應該釋放的內存,就會發生內存泄漏。

            廣義的說,內存泄漏不僅僅包含堆內存的泄漏,還包含系統資源的泄漏(resource leak),比如核心態HANDLE,GDI Object,SOCKET, Interface等,從根本上說這些由操作系統分配的對象也消耗內存,如果這些對象發生泄漏最終也會導致內存的泄漏。而且,某些對象消耗的是核心態內存,這些對象嚴重泄漏時會導致整個操作系統不穩定。所以相比之下,系統資源的泄漏比堆內存的泄漏更為嚴重。

            GDI Object的泄漏是一種常見的資源泄漏:

            void CMyView::OnPaint( CDC* pDC )

            {

            CBitmap bmp;

            CBitmap* pOldBmp;

            bmp.LoadBitmap(IDB_MYBMP);

            pOldBmp = pDC->SelectObject( &bmp );



            if( Something() ){

            return;

            }

            pDC->SelectObject( pOldBmp );

            return;

            }
            例二

            當函數Something()返回非零的時候,程序在退出前沒有把pOldBmp選回pDC中,這會導致pOldBmp指向的HBITMAP對象發生泄漏。這個程序如果長時間的運行,可能會導致整個系統花屏。這種問題在Win9x下比較容易暴露出來,因為Win9x的GDI堆比Win2k或NT的要小很多。

            內存泄漏的發生方式:

            以發生的方式來分類,內存泄漏可以分為4類:

            1. 常發性內存泄漏。發生內存泄漏的代碼會被多次執行到,每次被執行的時候都會導致一塊內存泄漏。比如例二,如果Something()函數一直返回True,那么pOldBmp指向的HBITMAP對象總是發生泄漏。

            2. 偶發性內存泄漏。發生內存泄漏的代碼只有在某些特定環境或操作過程下才會發生。比如例二,如果Something()函數只有在特定環境下才返回True,那么pOldBmp指向的HBITMAP對象并不總是發生泄漏。常發性和偶發性是相對的。對于特定的環境,偶發性的也許就變成了常發性的。所以測試環境和測試方法對檢測內存泄漏至關重要。

            3. 一次性內存泄漏。發生內存泄漏的代碼只會被執行一次,或者由于算法上的缺陷,導致總會有一塊僅且一塊內存發生泄漏。比如,在類的構造函數中分配內存,在析構函數中卻沒有釋放該內存,但是因為這個類是一個Singleton,所以內存泄漏只會發生一次。另一個例子:

            char* g_lpszFileName = NULL;

            void SetFileName( const char* lpcszFileName )

            {

            if( g_lpszFileName ){

            free( g_lpszFileName );

            }

            g_lpszFileName = strdup( lpcszFileName );

            }例三

            如果程序在結束的時候沒有釋放g_lpszFileName指向的字符串,那么,即使多次調用SetFileName(),總會有一塊內存,而且僅有一塊內存發生泄漏。

            4. 隱式內存泄漏。程序在運行過程中不停的分配內存,但是直到結束的時候才釋放內存。嚴格的說這里并沒有發生內存泄漏,因為最終程序釋放了所有申請的內存。但是對于一個服務器程序,需要運行幾天,幾周甚至幾個月,不及時釋放內存也可能導致最終耗盡系統的所有內存。所以,我們稱這類內存泄漏為隱式內存泄漏。舉一個例子:

            class Connection

            {

            public:

            Connection( SOCKET s);

            ~Connection();



            private:

            SOCKET _socket;



            };

            class ConnectionManager

            {

            public:

            ConnectionManager(){

            }

            ~ConnectionManager(){

            list::iterator it;

            for( it = _connlist.begin(); it != _connlist.end(); ++it ){

            delete (*it);
            }

            _connlist.clear();

            }

            void OnClientConnected( SOCKET s ){

            Connection* p = new Connection(s);

            _connlist.push_back(p);

            }

            void OnClientDisconnected( Connection* pconn ){

            _connlist.remove( pconn );

            delete pconn;

            }

            private:

            list _connlist;

            };

            例四

            假設在Client從Server端斷開后,Server并沒有呼叫OnClientDisconnected()函數,那么代表那次連接的Connection對象就不會被及時的刪除(在Server程序退出的時候,所有Connection對象會在ConnectionManager的析構函數里被刪除)。當不斷的有連接建立、斷開時隱式內存泄漏就發生了。

            從用戶使用程序的角度來看,內存泄漏本身不會產生什么危害,作為一般的用戶,根本感覺不到內存泄漏的存在。真正有危害的是內存泄漏的堆積,這會最終消耗盡系統所有的內存。從這個角度來說,一次性內存泄漏并沒有什么危害,因為它不會堆積,而隱式內存泄漏危害性則非常大,因為較之于常發性和偶發性內存泄漏它更難被檢測到。

            這個東西如果不是專業的人士最好不要用.

            內存泄漏的原因及解決辦法

            1、非靜態內部類創建靜態實例造成的內存泄漏。解決方法:將該內部類設為靜態內部類或將該內部類抽取出來封裝成一個單例,如果需要使用Context,就使用Application的Context。

            2、Handler造成的內存泄漏,解決方法:將Handler類獨立出來或者使用靜態內部類,這樣便可以避免內存泄漏。

            3、線程造成的內存泄漏,解決方法:將AsyncTask和Runnable類獨立出來或者使用靜態內部類,這樣便可以避免內存泄漏。

            4、使用ListView時造成的內存泄漏,解決方法:在構造Adapter時,使用緩存的convertView。

            5、集合容器中的內存泄露,解決方法:在退出程序之前,將集合里的東西clear,然后置為null,再退出程序。

            以上內容參考百度百科-內存泄漏


            內存泄漏是什么意思?簡單說說就行了。

            就是申請了內存空間,并讓一個指針變量指向這個空間,但之后卻錯誤地在未釋放這個空間,并且沒有用別的指針變量指向這個空間的情況下,將指針變量指到了別的地方,這樣就導致了無法再訪問到這個內存空間的情況,這就是內存泄漏

            內存溢出和內存泄漏分別是什么意思?

            內存溢出 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回收。
            第四步,使用內存查看工具動態查看內存使用情況

            本文發布于:2023-02-28 18:57:00,感謝您對本站的認可!

            本文鏈接:http://www.newhan.cn/zhishi/a/167759120548187.html

            版權聲明:本站內容均來自互聯網,僅供演示用,請勿用于商業和其他非法用途。如果侵犯了您的權益請與我們聯系,我們將在24小時內刪除。

            本文word下載地址:內存泄露(內存泄露檢測工具).doc

            本文 PDF 下載地址:內存泄露(內存泄露檢測工具).pdf

            標簽:內存   檢測工具
            相關文章
            留言與評論(共有 0 條評論)
               
            驗證碼:
            Copyright ?2019-2022 Comsenz Inc.Powered by ? 實用文體寫作網旗下知識大全大全欄目是一個全百科類寶庫! 優秀范文|法律文書|專利查詢|
            主站蜘蛛池模板: 国内少妇人妻偷人精品视频| 久久精品国产福利一区二区| 西西人体44WWW高清大胆| 日韩精品一卡二卡在线观看| 国产国产精品人体在线视| 人人妻人人澡人人爽| av无码一区二区大桥久未| 国产福利午夜十八禁久久| 女人香蕉久久毛毛片精品| 人妻一本久道久久综合鬼色| 午夜福利院一区二区三区| 内射无套内射国产精品视频| 国产三级精品三级在线区| 成人网站免费观看永久视频下载| 国产四虎永久免费观看| 久久精品国产再热青青青| 国产精品一区在线蜜臀| 377P欧洲日本亚洲大胆| 国产成人av电影在线观看第一页 | 蜜臀av日韩精品一区二区| 久久一区二区三区黄色片| 国产综合精品一区二区三区| 亚洲第一尤物视频在线观看导航| 久久久久国产a免费观看rela| 久久国产色av免费看| 久久国产精品一国产精品金尊| 老妇free性videosxx| 亚洲AV成人无码久久精品四虎| 亚洲中文字幕无线无码毛片| 女人的天堂av在线播放| 欧美丰满熟妇性XXXX| 东京热av无码电影一区二区| 2019天天拍拍天天爽视频| 久热这里只有精品12| 丁香婷婷综合激情五月色| 天堂va欧美ⅴa亚洲va在线| 久久国产精品乱子乱精品| 蜜臀视频在线观看一区二区| 亚洲国产在一区二区三区| 国产日韩综合av在线| 性欧美vr高清极品|