1. 盡量使用直接量
這個(gè)大家應(yīng)該清楚,所以只做簡(jiǎn)訴:
String str = "hello";
上面這種方式會(huì)創(chuàng)建一個(gè)“hello”字符串,而且JVM的字符緩存池還會(huì)緩存這個(gè)字符串;
String str = new String("hello");
此時(shí)程序除創(chuàng)建字符串外,str所引用的String對(duì)象底層還包含一個(gè)char[]數(shù)組,這個(gè)char[]數(shù)組依次存放了h,e,l,l,o
2. 使用StringBuilder和StringBuffer進(jìn)行字符串連接
這個(gè)我就不多講了,用String做連接時(shí)會(huì)生成大量臨時(shí)字符串
3. 盡早釋放無用對(duì)象的引用
大部分時(shí),方法局部引用變量所引用的對(duì)象 會(huì)隨著方法結(jié)束而變成垃圾,因此,大部分時(shí)候程序無需將局部,引用變量顯式設(shè)為null。
例如:
Public void test(){
Object obj = new Object();
……
Obj=null;
}
上面這個(gè)就沒必要了,隨著方法test()的執(zhí)行完成,程序中obj引用變量的作用域就結(jié)束了。但是如果是改成下面:
Public void test(){
Object obj = new Object();
……
Obj=null;
//執(zhí)行耗時(shí),耗內(nèi)存操作;或調(diào)用耗時(shí),耗內(nèi)存的方法
……
}
這時(shí)候就有必要將obj賦值為null,可以盡早的釋放對(duì)Object對(duì)象的引用。
4. 盡量少用靜態(tài)變量
當(dāng)某個(gè)對(duì)象被static變量所引用,那么GC通常是不會(huì)回收這個(gè)對(duì)象所占的內(nèi)存。如下:
Class Person{
static Object obj = new Object();
}
對(duì)于上面的對(duì)象而言,obj變量的生命周期與Person類同步,在其不被卸載的情況下,其對(duì)應(yīng)的Class對(duì)象會(huì)常駐內(nèi)存,知道程序結(jié)束。
5. 避免在經(jīng)常調(diào)用的方法、循環(huán)中創(chuàng)建java對(duì)象
6. 緩存經(jīng)常使用的對(duì)象
這里首先說一個(gè)實(shí)現(xiàn)緩存時(shí)常有的兩種方式:
n 使用HashMap進(jìn)行緩存
n 直接使用某些開源的緩存項(xiàng)目
如果是第一種,程序員需要手動(dòng)控制HashMap容器里key-value對(duì)不至于太多,從而導(dǎo)致其占用過大的內(nèi)存,致使系統(tǒng)性能下降。
而第二種多使用一些緩存算法,提高系統(tǒng)運(yùn)行效率,例如OSCache,Ehcache等,它們大都實(shí)現(xiàn)了FIFO\MRU等常見的緩存算法。
7. 盡量不要使用finalize方法
實(shí)際上,將資源清理放在finalize方法中完成是非常不好的選擇,由于GC的工作量很大,尤其是回收Young代內(nèi)存時(shí),大都會(huì)引起應(yīng)用程序暫停,所以再選擇使用finalize方法進(jìn)行資源清理,會(huì)導(dǎo)致GC負(fù)擔(dān)更大,程序運(yùn)行效率更差。
8. 考慮使用SoftReference
當(dāng)程序需要?jiǎng)?chuàng)建長(zhǎng)度很大的數(shù)組時(shí),可以考慮使用SoftReference來包裝數(shù)組元素
SoftReference是個(gè)很好的選擇,當(dāng)內(nèi)存足夠時(shí),它的功能等同于普通引用,當(dāng)內(nèi)存不足時(shí),它會(huì)犧牲自己,釋放軟引用所引用的對(duì)象。例如創(chuàng)建一個(gè)長(zhǎng)度為100000的Person數(shù)組。
注意:在使用軟引用來引用對(duì)象時(shí)不要忘記軟引用的不確定性,程序通過軟引用所獲取的對(duì)象有可能為null(內(nèi)存緊張時(shí))。所以當(dāng)應(yīng)用程序取出SoftReference所引用的java對(duì)象之后,應(yīng)該顯式判斷該對(duì)象死后為null,為null時(shí),應(yīng)該重建對(duì)象。
總結(jié):這只是在學(xué)習(xí)過程中的一些筆記,希望大家多溝通,共同進(jìn)步