4、內存管理小技巧
4、1 儘量使用直接量
String str = "hello";
上面方式會創建一個"hello"字符串,而且JVM的字符串緩存池還會緩存這個字符串。但是如果程序使用如下代碼: String str = new String("hello");
此時程序同樣創建了一個緩存在字符串緩存池中的"hello"字符串。除此之外,str所引用的String對象底層還包含了一個char[]數組,這個char[]數組裏依次存放了h、e、l、l、o等字符串。4、2 使用StringBuilder和StringBuffer進行字符串連接
4、3 儘早釋放無用對象的引用
4、4 儘量少用靜態變量
從理論上來說,Java對象何時被回收由垃圾回收機制決定,對程序員來說是不確定的。由於垃圾回收機制判斷一個對象是否是垃圾的唯一標準就是該對象是否有引用變量引用它,因此推薦儘早釋放對象的引用。 class Person {
static Object obj = new Object();
}
對於上面的Object對象而言,只要obj變量還引用到它,它就不會被垃圾回收機制所回收。obj變量是Person類的靜態變量,因此它的生命週期與Person類同步。在Person類不被卸載的情況下,Person類對應的Class對象會常駐內存,直到程序運行結束。因此,obj所引用的Object對象一旦創建,也會常駐內存,直到程序運行結束。4、5 避免在經常調用的方法、循環中創建Java對象
public class Test {
public static void main(String[] args) {
for(int i = 0 ; i < 10 ; i ++) {
Object obj = new Object();
//執行其他操作...
}
}
}
上面代碼在循環中創建10個Object對象,雖然上面程序中的obj變量都是代碼塊的局部變量,當循環執行結束時這些局部變量都會失效,但由於這段循環導致Object對象會被創建10次,因此係統需要不斷地爲10個對象分配內存空間並執行初始化操作。這10個對象的生存時間並不長,接下來系統又需要回收它們所佔用的空間。在這種不斷的分配、回收操作中,程序的性能受到巨大的影響。4、6 緩存經常使用的對象
- 使用HashMap進行緩存。
- 直接使用某些開源項目。
4、7 儘量不要使用finalize方法
在一個對象失去引用之後,垃圾回收器準備回收該對象之前,垃圾回收機制會先調用該對象的finalize()方法來執行資源清理。出於這種考慮,可能會考慮使用finalize()方法來進行資源清理。實際上,將資源清理放在finalize()方法中完成不是一個好選擇,在垃圾回收器本身已經嚴重製約應用程序性能的情況下,如果再選擇使用finalize()方法進行資源清理,無疑是火上澆油的行爲,這將導致垃圾回收器負擔更大,導致程序運行效率更差。