日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747


java內(nèi)存泄漏5種情況及總結(jié),讀完之后,大部分程序員收藏了...

 

內(nèi)存泄漏定義(memory leak):一個不再被程序使用的對象或變量還在內(nèi)存中占有存儲空間。一次內(nèi)存泄漏似乎不會有大的影響,但內(nèi)存泄漏堆積后的后果就是內(nèi)存溢出。
內(nèi)存溢出 out of memory :指程序申請內(nèi)存時(shí),沒有足夠的內(nèi)存供申請者使用,或者說,給了你一塊存儲int類型數(shù)據(jù)的存儲空間,但是你卻存儲long類型的數(shù)據(jù),那么結(jié)果就是內(nèi)存不夠用,此時(shí)就會報(bào)錯OOM,即所謂的內(nèi)存溢出。
二者的關(guān)系:

  1. 內(nèi)存泄漏的堆積最終會導(dǎo)致內(nèi)存溢出
  2. 內(nèi)存溢出就是你要的內(nèi)存空間超過了系統(tǒng)實(shí)際分配給你的空間,此時(shí)系統(tǒng)相當(dāng)于沒法滿足你的需求,就會報(bào)內(nèi)存溢出的錯誤。
  3. 內(nèi)存泄漏是指你向系統(tǒng)申請分配內(nèi)存進(jìn)行使用(new),可是使用完了以后卻不歸還(delete),結(jié)果你申請到的那塊內(nèi)存你自己也不能再訪問(也許你把它的地址給弄丟了),而系統(tǒng)也不能再次將它分配給需要的程序。就相當(dāng)于你租了個帶鑰匙的柜子,你存完東西之后把柜子鎖上之后,把鑰匙丟了或者沒有將鑰匙還回去,那么結(jié)果就是這個柜子將無法供給任何人使用,也無法被垃圾回收器回收,因?yàn)檎也坏剿娜魏涡畔ⅰ?/li>
  4. 內(nèi)存溢出:一個盤子用盡各種方法只能裝4個果子,你裝了5個,結(jié)果掉倒地上不能吃了。這就是溢出。比方說棧,棧滿時(shí)再做進(jìn)棧必定產(chǎn)生空間溢出,叫上溢,??諘r(shí)再做退棧也產(chǎn)生空間溢出,稱為下溢。就是分配的內(nèi)存不足以放下數(shù)據(jù)項(xiàng)序列,稱為內(nèi)存溢出。說白了就是我承受不了那么多,那我就報(bào)錯,

由于JAVA的JVM引入了垃圾回收機(jī)制,垃圾回收器會自動回收不再使用的對象,了解JVM回收機(jī)制的都知道JVM是使用引用計(jì)數(shù)法和可達(dá)性分析算法來判斷對象是否是不再使用的對象,本質(zhì)都是判斷一個對象是否還被引用。那么對于這種情況下,由于代碼的實(shí)現(xiàn)不同就會出現(xiàn)很多種內(nèi)存泄漏問題(讓JVM誤以為此對象還在引用中,無法回收,造成內(nèi)存泄漏)。

1、靜態(tài)集合類,如HashMap、LinkedList等等。如果這些容器為靜態(tài)的,那么它們的生命周期與程序一致,則容器中的對象在程序結(jié)束之前將不能被釋放,從而造成內(nèi)存泄漏。簡單而言,長生命周期的對象持有短生命周期對象的引用,盡管短生命周期的對象不再使用,但是因?yàn)殚L生命周期對象持有它的引用而導(dǎo)致不能被回收。

2、各種連接,如數(shù)據(jù)庫連接、網(wǎng)絡(luò)連接和IO連接等。在對數(shù)據(jù)庫進(jìn)行操作的過程中,首先需要建立與數(shù)據(jù)庫的連接,當(dāng)不再使用時(shí),需要調(diào)用close方法來釋放與數(shù)據(jù)庫的連接。只有連接被關(guān)閉后,垃圾回收器才會回收對應(yīng)的對象。否則,如果在訪問數(shù)據(jù)庫的過程中,對Connection、Statement或ResultSet不顯性地關(guān)閉,將會造成大量的對象無法被回收,從而引起內(nèi)存泄漏。

3、變量不合理的作用域。一般而言,一個變量的定義的作用范圍大于其使用范圍,很有可能會造成內(nèi)存泄漏。另一方面,如果沒有及時(shí)地把對象設(shè)置為null,很有可能導(dǎo)致內(nèi)存泄漏的發(fā)生。

public class UsingRandom {

  private String msg;

  public void receiveMsg(){

  readFromNet();// 從網(wǎng)絡(luò)中接受數(shù)據(jù)保存到msg中

  saveDB();// 把msg保存到數(shù)據(jù)庫中

  }

} 

如上面這個偽代碼,通過readFromNet方法把接受的消息保存在變量msg中,然后調(diào)用saveDB方法把msg的內(nèi)容保存到數(shù)據(jù)庫中,此時(shí)msg已經(jīng)就沒用了,由于msg的生命周期與對象的生命周期相同,此時(shí)msg還不能回收,因此造成了內(nèi)存泄漏。

實(shí)際上這個msg變量可以放在receiveMsg方法內(nèi)部,當(dāng)方法使用完,那么msg的生命周期也就結(jié)束,此時(shí)就可以回收了。還有一種方法,在使用完msg后,把msg設(shè)置為null,這樣垃圾回收器也會回收msg的內(nèi)存空間。

4、內(nèi)部類持有外部類,如果一個外部類的實(shí)例對象的方法返回了一個內(nèi)部類的實(shí)例對象,這個內(nèi)部類對象被長期引用了,即使那個外部類實(shí)例對象不再被使用,但由于內(nèi)部類持有外部類的實(shí)例對象,這個外部類對象將不會被垃圾回收,這也會造成內(nèi)存泄露。

5、改變哈希值,當(dāng)一個對象被存儲進(jìn)HashSet集合中以后,就不能修改這個對象中的那些參與計(jì)算哈希值的字段了,否則,對象修改后的哈希值與最初存儲進(jìn)HashSet集合中時(shí)的哈希值就不同了,在這種情況下,即使在contains方法使用該對象的當(dāng)前引用作為的參數(shù)去HashSet集合中檢索對象,也將返回找不到對象的結(jié)果,這也會導(dǎo)致無法從HashSet集合中單獨(dú)刪除當(dāng)前對象,造成內(nèi)存泄露。

分享到:
標(biāo)簽:泄漏 內(nèi)存 java
用戶無頭像

網(wǎng)友整理

注冊時(shí)間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定