Java项目代码优化
(1)避免创建过多的对象,java自带GC机制,不需要开发人员关心对象的回收机制,但大量临时对象的产生也会导致系统进行频繁的GC操作,从而导致系统性能问题。
A a = new A();
if(i1){
list.add(a);
}
可以改为:
if(i1){
A a = new A();
list.add(a);
}
(2)避免对变量的重复计算。
for(int i=0;i<list.size();i++)
可以改为:
for(int i=0,len=list.size();i<len;i++)
(3)合理创建HashMap,HashMap是常用到的集合之一,合理利用HashMap的构造函数。
public HashMap(int initialCapacity, float loadFactor);
默认情况下initialCapacity=16,loadFactor=0.75,当Hash Map里的容量超过16*0.75时,Hash Map会进行一次双倍容量的扩容操作。当可以通过业务判断出创建的Map所需容量大小是,可以创建的时候指定容量。同样,如果用到HashTable,vector等集合一样。
(4)尽量避免随意使用静态变量,当某个对象被static修饰,jvm一般是不会对这样的对象进行GC的,该对象会常驻内存。
public class A{
private static B b = new B();
}
(5)final修饰符,被final修饰的方法不会被子类重写,调用被final修饰的方法效率更高,常见的getter/setter方法可以设置成final。
public class A{
private int id;
public int getId() {return id;}
public void setId(int id) {this.id = id;}
}
可以改为
public class A{
private int id;
final public int getId() {return id;}
final public void setId(int id) {this.id = id;}
}
(6)尽量使用局部变量,调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快;静态变量,实例变量在堆中生成,相对较慢。
(7)尽量不要使用finalize方法,java提供该方法可以让开发人员手动进行GC,但是jVM的GC工作量很大,尤其是回收年轻代(Young)时,大都会引起STW,导致程序暂停,所以再选择手动使用finalize方法进行垃圾回收,会导致GC负担更大,程序运行效率更差。
(8)在线程安全的前提下尽量使用HashMap,Array List等非线程安全的集合,Hash Table,ConcurrentHashMap,Vector等线程安全的集合由于内部实现采用了同步机制,会导致效率更慢。
(9)释放资源的操作尽量在finally语句块中执行,不管程序运行结果如何,finally语句块都会执行,不会出现资源未释放的情况。
(10)String,StringBuffer,StringBuilder,如果存在字符串拼接的情况尽量使用StringBuilder和StringBuffer来进行,这样不会产生新的对象,此外StringBuffer是线程安全的,同样内部实现采用了同步机制,StringBuilder是线程不安全的,效率更高,使用StringBuilder和StringBuffer尽量确定大小,默认是采用一个大小16的字符数据来存储字符串,超过这个长度之后会产生数组的复制等操作
String str = “hello”;
str += “world”;//产生一个新对象,这时jvm中其实存在两个对象,即“hello”和“helloworld”
(11)尽早释放无用对象的引用,JVM标记无用对象采用的是可达性分析算法,通过GC Roots对象是否可以引用关联到该对象,关联不到该对象,则该对象为需要回收的对象,早些释放引用,就可以早点回收该对象占用的内存空间,方法局部引用的对象可以不做处理
Public void test(){
Object obj = new Object();
……
Obj=null;
}
这种可以不用处理,因为方法结束了,obj对象也就变成了需要回收的对象了
Public void test(){
Object obj = new Object();
……
Obj=null;
……
}
这种类变量,如果后面的逻辑不需要用到这个对象可以将其置为null,方便GC
上面是最近对要进行代码优化的项目产出的一个文档,里面参考了网上了很多大佬的文章,由于比较急并没有记录他们的博客地址。并非完全是原创,特此声明!