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()方法进行资源清理,无疑是火上浇油的行为,这将导致垃圾回收器负担更大,导致程序运行效率更差。