1:尽量避免使用静态变量
当某个对象被定义为static变量所引用,那么GC通常不会回收这个对象所占有的内存,如
publi class A{
private static B b = new B();
}
此时静态变量b的生命周期和A类同步,如果A类不卸载,那么b对象会常驻内存,直到程序终止。
2:尽量避免过多过常地创建java对象
尽量避免在经常调用的方法、循环中new 对象,由于系统不仅要花费时间来创建对象,要占用过多的堆内存,而且还要花时间对这些对象进行垃圾回收和处理,
在我们可以控制的范围内,最大限度地重用对象,最好能用基本的数据类型或数组来替代对象
3:尽量使用final修饰符
带有final修饰符的类是不可派生的。在java核心API中,有许多应用final的列子,例如java、lang、string,为String类指定final防止了使用者覆盖
length()方法。另外,如果一个类是final的,则该类所有方法都是final的。java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关),
此举能能够使性能平均提高50%。
如:让访问实例内变量的geter/setter方法变成final:
简单的getter/setter方法应该被置成final,这会告诉编译器,这个方法不会被重载,所以,可以变成“inlined”,例子:
clsss MAF{
private int _size;
public void setSize(int size){
_size = size;
}
更正为
clsss MAF_fixed{
private int _size;
final public void setSize(int size){
_size = size;
}
}
4.使用基本数据类型代替对象
String str = "hello";
上面这种方式会创建”hello“字符串,而且JVM的字符缓存池还会缓存这个字符串;
String str= new String(”hello");
5.尽量合理的创建HashMap
当你创建一个比较大的hashMap时,充分利用这个构造函数。
public HashMap(int initialCapacity, float loadFactor);
避免HashMap多次进行hash重构,扩容是一件很耗费性能的事,在默认中initialCapacity只用16,而loadFactor 是0.75,需要多大的容量,你最好能准确的
估计你所需要的最佳大小,同样的HashTable,Vectors也是一样的道理。
6.尽量减少对变量的重复计算
如:
for(int i = 0;i < list.size(); i ++)
应改成:
for(int i = 0,len=list.size(); i < len; i++)
并且在循环中应该避免使用复杂的表达式,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而循环条件值不变的话,程序将会运行的更快
7.尽量使用移位来替代乘法和除法。
“/”是一个代价和高的操作,使用移位的操作将会更快和更有效
如:
int num = a/4;
int num2 = a/8;
int num = a*4;
int num2 = a*8;
应该改为:
int num = a>> 2;
int num2 = a >>3;
/
int num = a<<4;
int num2 = <<8;
但注意的是移位应添加注释,因为移位操作不直观,比较难理解。
8.尽量避免使用split
除非是必须的,否者应该避免使用split,split由于支持正则表达式,所以效率比较低,如果是频繁的几十,几百万的调用将会耗费大量资源,如果确实需频繁
的调用split,可以考虑使用apache的StringUtils.split(String,char),频繁的可以缓存结果。
9.不要再循环中使用Try/catch语句,应该把Try/Catch放在循环最外层。
Error是获取系统错误的类,或者说是虚拟机错误的类。不是所有的错误Exception都能获取到的,虚拟机报错Exception就获取不到,必须用Error获取。
10.尽量重用对象。
特别是 String 对象的使用,出现字符串连接时应该使用 StringBuilder/StringBuffer 代替。由于 Java 虚拟机不仅要花时间生成对象,以后可能还需要花时间对这些对象进行垃圾回收和处理,因此生成过多的对象将会给程序的性能带来很大的影响。
11.循环内不要不断创建对象引用。