注意Java代碼的內(nèi)存泄漏
對(duì)于有語(yǔ)言編譯基礎(chǔ)的同志,要注意了,如果你是剛學(xué)java的.那么下面你必須要看.當(dāng)然本人也是一樣,也會(huì)出現(xiàn)下面某些錯(cuò)誤。所以本人總結(jié)了一些。
當(dāng)然都是個(gè)人看法.不代表就是對(duì)的.也許有些是錯(cuò)的.同時(shí)也希望熟悉JAVA的高高手指出.或者有更好的看法或建議.都可以和我溝通.大家一齊來(lái)學(xué)習(xí)。
同時(shí)這也是對(duì)自己的一種提高。
在項(xiàng)目應(yīng)用中.往往都是面臨復(fù)雜的業(yè)務(wù).而且用戶(hù)量增加.內(nèi)存使用自然就會(huì)增大.還有HTTP的服務(wù)器只有一定的能力.所以代碼編寫(xiě)也是一件非常重要的.性能和穩(wěn)定.這個(gè)是極為重要。
總結(jié)如下:
1、盡早釋放無(wú)用對(duì)象的引用。特別是大對(duì)象和集合對(duì)象,通過(guò)置為NULL,暗示垃圾收集器來(lái)收集該對(duì)象,防止發(fā)生內(nèi)存泄露。
2、程序中如果出現(xiàn)大量使用字符串處理,避免使用 String ,應(yīng)使用 StringBuffer。
- for(Int i=0;i<100;i++)
- {
- String s1="";
- s1=s1+"abc";//不要這樣寫(xiě)
- }
3、盡量少用靜態(tài)變量,因?yàn)殪o態(tài)變量是全局的, GC 不會(huì)回收的;
4、避免集中創(chuàng)建對(duì)象尤其是大對(duì)象, JVM 會(huì)突然需要大量?jī)?nèi)存,這時(shí)必然會(huì)觸發(fā) GC 優(yōu)化系統(tǒng)內(nèi)存環(huán)境;顯示的聲明數(shù)組空間,而且申請(qǐng)數(shù)量還極大。
5、盡量運(yùn)用對(duì)象池技術(shù)以提高系統(tǒng)性能;生命周期長(zhǎng)的對(duì)象擁有生命周期短的對(duì)象時(shí)容易引發(fā)內(nèi)存泄漏,例如大集合對(duì)象擁有大數(shù)據(jù)量的業(yè)務(wù)對(duì)象的時(shí)候,可以考慮分塊進(jìn)行處理,然后解決一塊釋放一塊的策略。
5、不要在經(jīng)常調(diào)用的方法中創(chuàng)建對(duì)象,尤其是忌諱在循環(huán)中創(chuàng)建對(duì)象??梢赃m當(dāng)?shù)氖褂?hashtable , vector 創(chuàng)建一組對(duì)象容器,然后從容器中去取那些對(duì)象,而不用每次 new 之后又丟棄。
6、一般都是發(fā)生在開(kāi)啟大型文件或跟數(shù)據(jù)庫(kù)一次拿了太多的數(shù)據(jù),造成 Out Of Memory Error 的狀況,這時(shí)就大概要計(jì)算一下數(shù)據(jù)量的最大值是多少,并且設(shè)定所需最小及最大的內(nèi)存空間值。
7、注意集合數(shù)據(jù)類(lèi)型,包括數(shù)組、樹(shù)、圖、鏈表等數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)對(duì)GC來(lái)說(shuō),回收更為復(fù)雜。
8、盡量避免在類(lèi)的默認(rèn)構(gòu)造器中創(chuàng)建、初始化大量的對(duì)象,防止在調(diào)用其自類(lèi)的構(gòu)造器時(shí)造成不必要的內(nèi)存資源浪費(fèi)。
9、盡量避免強(qiáng)制系統(tǒng)做垃圾內(nèi)存的回收,增長(zhǎng)系統(tǒng)做垃圾回收的最終時(shí)間。
10、代碼中是否有死循環(huán)或遞歸調(diào)用
11、是否有大循環(huán)重復(fù)產(chǎn)生新對(duì)象實(shí)體。
12、檢查L(zhǎng)ist、MAP等集合對(duì)象是否有使用完后,未清除的問(wèn)題。List、MAP等集合對(duì)象會(huì)始終存有對(duì)對(duì)象的引用,使得這些對(duì)象不能被GC回收。
下面給出了一個(gè)簡(jiǎn)單的內(nèi)存泄露的例子。在這個(gè)例子中,我們循環(huán)申請(qǐng)Object對(duì)象,并將所申請(qǐng)的對(duì)象放入一個(gè)Vector中,如果我們僅僅釋放引用本身,那么Vector仍然引用該對(duì)象,所以這個(gè)對(duì)象對(duì)GC來(lái)說(shuō)是不可回收的。
- Vector v=new Vector(10);
- for (int i=1;i<100; i++)
- {
- Object o=new Object();
- v.add(o);
- o=null;
- }
函數(shù)內(nèi),如果可以清除的,清除集合中對(duì)象
- Map<Object,Object> v=new Map<Object,Object>();
- for (int i=1;i<100; i++)
- {
- Object o=new Object();
- v.put(i,o);
- }
- v.clear();