国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

Java內(nèi)存泄漏與內(nèi)存溢出詳解

2019-11-14 10:05:22
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

內(nèi)存泄漏指你用malloc或new申請(qǐng)了一塊內(nèi)存,但是沒(méi)有通過(guò)free或delete將內(nèi)存釋放,導(dǎo)致這塊內(nèi)存一直處于占用狀態(tài)。

內(nèi)存溢出指你申請(qǐng)了10個(gè)字節(jié)的空間,但是你在這個(gè)空間寫(xiě)入11或以上字節(jié)的數(shù)據(jù),就是溢出。


內(nèi)存泄露是指程序中間動(dòng)態(tài)分配了內(nèi)存,但在程序結(jié)束時(shí)沒(méi)有釋放這部分內(nèi)存,從而造成那部分內(nèi)存不可用的情況,重啟計(jì)算機(jī)可以解決,但也有可能再次發(fā)生內(nèi)存泄露,內(nèi)存泄露和硬件沒(méi)有關(guān)系,它是由軟件設(shè)計(jì)缺陷引起的。

內(nèi)存泄漏可以分為4類(lèi): 1)常發(fā)性?xún)?nèi)存泄漏。發(fā)生內(nèi)存泄漏的代碼會(huì)被多次執(zhí)行到,每次被執(zhí)行的時(shí)候都會(huì)導(dǎo)致一塊內(nèi)存泄漏。

2)偶發(fā)性?xún)?nèi)存泄漏。發(fā)生內(nèi)存泄漏的代碼只有在某些特定環(huán)境或操作過(guò)程下才會(huì)發(fā)生。常發(fā)性和偶發(fā)性是相對(duì)的。對(duì)于特定的環(huán)境,偶發(fā)性的也許就變成了常發(fā)性的。所以測(cè)試環(huán)境和測(cè)試方法對(duì)檢測(cè)內(nèi)存泄漏至關(guān)重要。

3)一次性?xún)?nèi)存泄漏。發(fā)生內(nèi)存泄漏的代碼只會(huì)被執(zhí)行一次,或者由于算法上的缺陷,導(dǎo)致總會(huì)有一塊僅且一塊內(nèi)存發(fā)生泄漏。比如,在類(lèi)的構(gòu)造函數(shù)中分配內(nèi)存,在析構(gòu)函數(shù)中卻沒(méi)有釋放該內(nèi)存,所以?xún)?nèi)存泄漏只會(huì)發(fā)生一次。

4)隱式內(nèi)存泄漏。程序在運(yùn)行過(guò)程中不停的分配內(nèi)存,但是直到結(jié)束的時(shí)候才釋放內(nèi)存。嚴(yán)格的說(shuō)這里并沒(méi)有發(fā)生內(nèi)存泄漏,因?yàn)樽罱K程序釋放了所有申請(qǐng)的內(nèi)存。但是對(duì)于一個(gè)服務(wù)器程序,需要運(yùn)行幾天,幾周甚至幾個(gè)月,不及時(shí)釋放內(nèi)存也可能導(dǎo)致最終耗盡系統(tǒng)的所有內(nèi)存。所以,我們稱(chēng)這類(lèi)內(nèi)存泄漏為隱式內(nèi)存泄漏。

內(nèi)存溢出即用戶(hù)在對(duì)其數(shù)據(jù)緩沖區(qū)操作時(shí),超過(guò)了其緩沖區(qū)的邊界;尤其是對(duì)緩沖區(qū)寫(xiě)操作時(shí),緩沖區(qū)的溢出很可能導(dǎo)致程序的異常。


java內(nèi)存泄露與溢出的區(qū)別

內(nèi)存溢出就是你要求分配的內(nèi)存超出了系統(tǒng)能給你的,系統(tǒng)不能滿(mǎn)足需求,于是產(chǎn)生溢出。

Java內(nèi)存泄漏就是沒(méi)有及時(shí)清理內(nèi)存垃圾,導(dǎo)致系統(tǒng)無(wú)法再給你提供內(nèi)存資源(內(nèi)存資源耗盡)。

看到上面的解釋?zhuān)赡苡行┡笥堰€是不太理解吧。沒(méi)問(wèn)題,看以下例子:

1.Java內(nèi)存泄露是說(shuō)程序邏輯問(wèn)題,造成申請(qǐng)的內(nèi)存無(wú)法釋放.這樣的話(huà)無(wú)論多少內(nèi)存,早晚都會(huì)被占用光的. 最簡(jiǎn)單的例子就是死循環(huán)了.由于程序判斷錯(cuò)誤導(dǎo)經(jīng)常發(fā)生此事。

2.Java內(nèi)存泄漏是指在堆上分配的內(nèi)存沒(méi)有被釋放,從而失去對(duì)其控制。這樣會(huì)造成程序能使用的內(nèi)存越來(lái)越少,導(dǎo)致系統(tǒng)運(yùn)行速度減慢,嚴(yán)重情況會(huì)使程序當(dāng)?shù)簟?/p>

3.關(guān)于內(nèi)存溢出有點(diǎn)出入。比如說(shuō)你申請(qǐng)了一個(gè)integer,但給它存了long才能存下的數(shù),那就是內(nèi)存溢出。

舉個(gè)現(xiàn)實(shí)中的例子: 比如有一個(gè)桶,裝滿(mǎn)了水.你丟個(gè)蘋(píng)果進(jìn)去。桶的水正常。如果你放個(gè)大石頭。水就出溢出,內(nèi)存溢出也就是這個(gè)原理。 區(qū)別:內(nèi)存溢出,提供的內(nèi)存不夠;Java內(nèi)存泄漏,無(wú)法再提供內(nèi)存資源。


相關(guān)問(wèn)題

Q:Java中會(huì)存在內(nèi)存泄漏嗎? A: Java中也存在內(nèi)存泄露。當(dāng)被分配的對(duì)象可達(dá)但已無(wú)用(未對(duì)作廢數(shù)據(jù)內(nèi)存單元的引用置null)即會(huì)引起。

Q: 如何避免內(nèi)存泄露、溢出? A: 1)盡早釋放無(wú)用對(duì)象的引用。

好的辦法是使用臨時(shí)變量的時(shí)候,讓引用變量在退出活動(dòng)域后自動(dòng)設(shè)置為null,暗示垃圾收集器來(lái)收集該對(duì)象,防止發(fā)生內(nèi)存泄露。

2)程序進(jìn)行字符串處理時(shí),盡量避免使用String,而應(yīng)使用StringBuffer。

3) 盡量少用靜態(tài)變量。

因?yàn)殪o態(tài)變量是全局的,GC不會(huì)回收。

4)避免集中創(chuàng)建對(duì)象尤其是大對(duì)象,如果可以的話(huà)盡量使用流操作。

5)盡量運(yùn)用對(duì)象池技術(shù)以提高系統(tǒng)性能。

生命周期長(zhǎng)的對(duì)象擁有生命周期短的對(duì)象時(shí)容易引發(fā)內(nèi)存泄漏,例如大集合對(duì)象擁有大數(shù)據(jù)量的業(yè)務(wù)對(duì)象的時(shí)候,可以考慮分塊進(jìn)行處理,然后解決一塊釋放一塊的策略。

6)不要在經(jīng)常調(diào)用的方法中創(chuàng)建對(duì)象,尤其是忌諱在循環(huán)中創(chuàng)建對(duì)象。

可以適當(dāng)?shù)氖褂胔ashtable,vector創(chuàng)建一組對(duì)象容器,然后從容器中去取那些對(duì)象,而不用每次new之后又丟棄。

7) 優(yōu)化配置。


發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 蕲春县| 靖边县| 宣威市| 伊春市| 沂水县| 澄江县| 望城县| 阳原县| 宜君县| 清原| 河间市| 仪陇县| 海城市| 珲春市| 鄂伦春自治旗| 定西市| 左贡县| 赣州市| 宁河县| 钦州市| 根河市| 定南县| 昌邑市| 石棉县| 长阳| 舟曲县| 湟中县| 龙里县| 巴青县| 新乡县| 临武县| 白玉县| 阿拉善左旗| 长宁县| 启东市| 色达县| 鄂州市| 敦煌市| 岑巩县| 望谟县| 加查县|