您好,登錄后才能下訂單哦!
Java中的內(nèi)存泄露與內(nèi)存溢出是什么?為什么會(huì)出現(xiàn)內(nèi)存溢出和內(nèi)存泄露?這些問(wèn)題可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到的。通過(guò)這些問(wèn)題,希望你能收獲更多。下面是揭開(kāi)這些問(wèn)題的詳細(xì)內(nèi)容。
01
內(nèi)存泄漏 & 內(nèi)存溢出
1.內(nèi)存泄漏(memory leak )
申請(qǐng)了內(nèi)存用完了不釋放,比如一共有 1024M 的內(nèi)存,分配了 521M 的內(nèi)存一直不回收,那么可以用的內(nèi)存只有 521M 了,仿佛泄露掉了一部分;
通俗一點(diǎn)講的話(huà),內(nèi)存泄漏就是【占著茅坑不拉shi】。
2.內(nèi)存溢出(out of memory)
申請(qǐng)內(nèi)存時(shí),沒(méi)有足夠的內(nèi)存可以使用;
通俗一點(diǎn)兒講,一個(gè)廁所就三個(gè)坑,有兩個(gè)站著茅坑不走的(內(nèi)存泄漏),剩下最后一個(gè)坑,廁所表示接待壓力很大,這時(shí)候一下子來(lái)了兩個(gè)人,坑位(內(nèi)存)就不夠了,內(nèi)存泄漏變成內(nèi)存溢出了。
可見(jiàn),內(nèi)存泄漏和內(nèi)存溢出的關(guān)系:內(nèi)存泄露的增多,最終會(huì)導(dǎo)致內(nèi)存溢出。
這是一個(gè)很有味道的例子。
如上圖:
對(duì)象 X 引用對(duì)象 Y,X 的生命周期比 Y 的生命周期長(zhǎng);
那么當(dāng)Y生命周期結(jié)束的時(shí)候,X依然引用著Y,這時(shí)候,垃圾回收期是不會(huì)回收對(duì)象Y的;
如果對(duì)象X還引用著生命周期比較短的A、B、C,對(duì)象A又引用著對(duì)象 a、b、c,這樣就可能造成大量無(wú)用的對(duì)象不能被回收,進(jìn)而占據(jù)了內(nèi)存資源,造成內(nèi)存泄漏,直到內(nèi)存溢出。
02
泄漏的分類(lèi)
經(jīng)常發(fā)生:發(fā)生內(nèi)存泄露的代碼會(huì)被多次執(zhí)行,每次執(zhí)行,泄露一塊內(nèi)存;
偶然發(fā)生:在某些特定情況下才會(huì)發(fā)生;
一次性:發(fā)生內(nèi)存泄露的方法只會(huì)執(zhí)行一次;
隱式泄露:一直占著內(nèi)存不釋放,直到執(zhí)行結(jié)束;嚴(yán)格的說(shuō)這個(gè)不算內(nèi)存泄露,因?yàn)樽罱K釋放掉了,但是如果執(zhí)行時(shí)間特別長(zhǎng),也可能會(huì)導(dǎo)致內(nèi)存耗盡。
03
導(dǎo)致內(nèi)存泄漏的常見(jiàn)原因
循環(huán)過(guò)多或死循環(huán),產(chǎn)生大量對(duì)象;
單例模式,和靜態(tài)集合導(dǎo)致內(nèi)存泄露的原因類(lèi)似,因?yàn)閱卫撵o態(tài)特性,它的生命周期和 JVM 的生命周期一樣長(zhǎng),所以如果單例對(duì)象如果持有外部對(duì)象的引用,那么這個(gè)外部對(duì)象也不會(huì)被回收,那么就會(huì)造成內(nèi)存泄漏。
數(shù)據(jù)連接、IO、Socket連接等等,它們必須顯示釋放(用代碼 close 掉),否則不會(huì)被 GC 回收。
內(nèi)部類(lèi)的對(duì)象被長(zhǎng)期持有,那么內(nèi)部類(lèi)對(duì)象所屬的外部類(lèi)對(duì)象也不會(huì)被回收。
可以看到,在測(cè)試方法中,當(dāng)元素的 hashCode 發(fā)生改變之后,就再也找不到改變之前的那個(gè)元素了;
這也是 String 為什么被設(shè)置成了不可變類(lèi)型,我們可以放心地把 String 存入 HashSet,或者把 String 當(dāng)做 HashMap 的 key 值;
當(dāng)我們想把自己定義的類(lèi)保存到散列表的時(shí)候,需要保證對(duì)象的 hashCode 不可變。
看完上述內(nèi)容,你們對(duì)Java中的內(nèi)存泄露與內(nèi)存溢大概了解了嗎?如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。