什麼是記憶體流失?參加了“第十一屆中國國際軟體博覽會系列論壇-開放軟體技術高峰論壇”後

來源:互聯網
上載者:User

       今天去參加了“第十一屆中國國際軟體博覽會系列論壇-開放軟體技術高峰論壇”,哦,現在是臨晨了,應該是昨天。感覺很不錯,sun公司Java軟體部門總監,Janet Koening讓我不僅瞭解了Java的很多開發工具,而且真實的讓我現場體驗了一把標準美語,這比起每天看Friends強多了。Thank you Janet Koening!You was supposed to give us the show about Java technology base on Open JDK  on the schedule,but it was given by the other man in the end,very disappointed!By the way,the lunch was really good,thanks Sun。

     Sun的進階工程師,演講也不錯的,氣氛很活潑。可是他說一個多小時,從開始問“Java有記憶體流失嗎?”他說“有”起,就一直在講Java“記憶體流失”的問題。他說:Java“記憶體流失”就是當你不斷申請記憶體對象後,這些對象還可以引用但是實際你已經沒有使用了,這時Java虛擬機器由於可以通過全域對象找到它們所以不釋放,這樣記憶體不斷增長直到記憶體耗盡,這就是Java的記憶體流失。並且還做了一個程式來示範記憶體流失記憶體耗盡後Java異常處理的提示。這話要是被Java虛擬機器編寫的人知道了,不吐血才怪!

    那麼什麼叫記憶體流失?記憶體流失就是在程式堆棧裡申請了記憶體後沒有顯式釋放它,並且使指向這個記憶體塊的所有指標指向其他記憶體塊或退出範圍而導致這個記憶體塊既無法訪問又無法釋放的情況(自己的定義,可能不是很準確,大概意思是這個了)。這種既不能訪問又不能釋放的記憶體不斷積累就會造成系統記憶體浪費,無法使用,甚至耗盡所有系統記憶體!下面的這段代碼就是記憶體流失的例子:
      char *p1 = (char*)malloc(100);
      p1 = NULL;//Now memory leak ,you can use free(p1); to avoid memory leak when p1 is no longer used
      char *p2 = new char[100];
      p2 = NULL;//Now  memory leak again ,you can use delete p2; toavoid memory leak when p2 is no longer used

    Java記憶體流失的例子我實在沒有辦法舉,因為Java虛擬機器做的事就是把這些不能訪問的記憶體釋放的,所以如果Java虛擬機器的編寫者編程的時候沒有開小差的話,Java是不會有記憶體流失的,如果有也是當有記憶體不能訪問後Java虛擬機器還來不及釋放暫時的記憶體流失,當虛擬機器有CPU時間後就會把它們釋放的。演講者所說的充其量不過是編程不規範而已,如果把它歸為記憶體流失Java虛擬機器就白乾了。
     所以記憶體流失不能隨便說的,因為那關係到一個程式員是不是菜鳥的問題。跟記憶體流失一起出現的敏感問題就是記憶體溢出,它是和記憶體流失是雙胞胎,常常令C、C++程式員煩惱不已,記憶體溢出還可以為駭客攻擊帶來潛在的威脅。
    記憶體溢出就是使用的記憶體超過了申請的記憶體大小,這種情況輕則覆蓋同一個進程的其他變數,造成記憶體進程不可以意料的後果甚至崩潰,重則超出到其他進程空間或系統空間造成拒絕訪問從而程式崩潰,最嚴重的就是給駭客攻擊帶來機會。以下代碼就是簡單的記憶體溢出(當然現實編程溢出不可能這麼簡單的出現):

    char *p = malloc(10);//allocate 10 bytes of memory
    char *str = "memory overflow is never happen in my program!";
    memcpy(p,str,strlen(str));//now memory overflow

  不過,這些隨著Java虛擬機器和.net framework的出現越來越多的Java程式員和.net程式員對記憶體流失和記憶體溢出都是聞其名而不見其影了,他們不用擔心這些問題的發生就像C++程式員不用在意寄存器的利用率一樣。對於Java和.net需要記憶體儘管new就是了!不過還是要注意能使用局部變數就盡量使用局部變數的原則和確定不用的對象要讓它賦空值null,從而讓虛擬機器可以及時釋放。不然真的會出現演講者說的“記憶體流失”的。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.