https://www.cnblogs.com/tiancai/p/9634332.html
內(nèi)存泄漏:
概念:由于java的JVM引入了垃圾回收機(jī)制,垃圾回收器會自動回收不再使用的對象;JVM是使用引用計數(shù)法和可達(dá)性分析算法來判斷對象是否是不再使用的對象,本質(zhì)都是判斷一個對象是否還被引用。那么對于這種情況下,由于代碼的實現(xiàn)不同就會出現(xiàn)很多種內(nèi)存泄漏問題(讓JVM誤以為此對象還在引用中,無法回收,造成內(nèi)存泄漏)。
造成內(nèi)存泄漏的方式:
1:靜態(tài)集合類
2:各種連接沒有關(guān)閉:數(shù)據(jù)庫,io
3:變量不合理的作用域:變量定義的范圍大于其使用的范圍,如果沒有及時把變量置為null,就容易內(nèi)存泄露
4、內(nèi)部類持有外部類,如果一個外部類的實例對象的方法返回了一個內(nèi)部類的實例對象,這個內(nèi)部類對象被長期引用了,即使那個外部類實例對象不再被使用,但由于內(nèi)部類持有外部類的實例對象,這個外部類對象將不會被垃圾回收,這也會造成內(nèi)存泄露。???????????????????????????????????????????????????????????????????????????????????????????
5、改變哈希值,當(dāng)一個對象被存儲進(jìn)HashSet集合中以后,就不能修改這個對象中的那些參與計算哈希值的字段了,否則,對象修改后的哈希值與最初存儲進(jìn)HashSet集合中時的哈希值就不同了,在這種情況下,即使在contains方法使用該對象的當(dāng)前引用作為的參數(shù)去HashSet集合中檢索對象,也將返回找不到對象的結(jié)果,這也會導(dǎo)致無法從HashSet集合中單獨(dú)刪除當(dāng)前對象,造成內(nèi)存泄露