1. 尽量使用直接量
这个大家应该清楚,所以只做简诉:
String str = "hello";
上面这种方式会创建一个“hello”字符串,而且JVM的字符缓存池还会缓存这个字符串;
String str = new String("hello");
此时程序除创建字符串外,str所引用的String对象底层还包含一个char[]数组,这个char[]数组依次存放了h,e,l,l,o
2. 使用StringBuilder和StringBuffer进行字符串连接
这个我就不多讲了,用String做连接时会生成大量临时字符串
3. 尽早释放无用对象的引用
大部分时,方法局部引用变量所引用的对象 会随着方法结束而变成垃圾,因此,大部分时候程序无需将局部,引用变量显式设为null。
例如:
Public void test(){
Object obj = new Object();
……
Obj=null;
}
上面这个就没必要了,随着方法test()的执行完成,程序中obj引用变量的作用域就结束了。但是如果是改成下面:
Public void test(){
Object obj = new Object();
……
Obj=null;
//执行耗时,耗内存操作;或调用耗时,耗内存的方法
……
}
这时候就有必要将obj赋值为null,可以尽早的释放对Object对象的引用。
4. 尽量少用静态变量
当某个对象被static变量所引用,那么GC通常是不会回收这个对象所占的内存。如下:
Class Person{
static Object obj = new Object();
}
对于上面的对象而言,obj变量的生命周期与Person类同步,在其不被卸载的情况下,其对应的Class对象会常驻内存,知道程序结束。
5. 避免在经常调用的方法、循环中创建java对象
6. 缓存经常使用的对象
这里首先说一个实现缓存时常有的两种方式:
n 使用HashMap进行缓存
n 直接使用某些开源的缓存项目
如果是第一种,程序员需要手动控制HashMap容器里key-value对不至于太多,从而导致其占用过大的内存,致使系统性能下降。
而第二种多使用一些缓存算法,提高系统运行效率,例如OSCache,Ehcache等,它们大都实现了FIFO\MRU等常见的缓存算法。
7. 尽量不要使用finalize方法
实际上,将资源清理放在finalize方法中完成是非常不好的选择,由于GC的工作量很大,尤其是回收Young代内存时,大都会引起应用程序暂停,所以再选择使用finalize方法进行资源清理,会导致GC负担更大,程序运行效率更差。
8. 考虑使用SoftReference
当程序需要创建长度很大的数组时,可以考虑使用SoftReference来包装数组元素
SoftReference是个很好的选择,当内存足够时,它的功能等同于普通引用,当内存不足时,它会牺牲自己,释放软引用所引用的对象。例如创建一个长度为100000的Person数组。
注意:在使用软引用来引用对象时不要忘记软引用的不确定性,程序通过软引用所获取的对象有可能为null(内存紧张时)。所以当应用程序取出SoftReference所引用的java对象之后,应该显式判断该对象死后为null,为null时,应该重建对象。
总结:这只是在学习过程中的一些笔记,希望大家多沟通,共同进步