主题
Java代码层优化
避免过度创建对象
尽量重用对象,避免频繁创建和销毁对象,特别是在循环或高频调用的代码中。
使用对象池或缓存来管理对象的生命周期,减少对象的创建开销。
使用局部变量
在方法中使用局部变量而不是实例变量,可以提高访问速度和减少内存开销。
避免在循环中重复访问成员变量,尽量将其缓存到局部变量中。
避免过度使用同步
同步会引入性能开销和潜在的死锁风险,尽量减少同步的范围和频率。
使用并发容器或原子类来替代传统的同步机制,以提高并发性能。
使用合适的数据结构和算法
根据实际需求选择合适的数据结构和算法,避免使用不必要的复杂度高的算法。
使用哈希表、树等高效的数据结构来提高查找和插入操作的性能。
优化循环和条件判断
尽量避免在循环中进行重复计算或重复判断。
使用更高效的循环方式(如增强型循环、流式操作等)来简化代码并提高性能。
减少方法调用和递归
减少不必要的方法调用和递归,尽量将逻辑内联到主调用方法中。
使用迭代替代递归,避免递归深度过大导致栈溢出。
优化IO操作
尽量减少IO操作的次数和大小,批量读写数据可以提高IO效率。
使用缓冲流来减少IO调用次数,提高IO性能。
使用性能调优工具
使用性能调优工具(如JProfiler、VisualVM等)来分析和定位性能瓶颈,优化关键代码段。
使用代码静态分析工具(如FindBugs、SonarQube等)来检查代码中的潜在性能问题和错误。
其他
容器类初始化的时候指定长度
java
List<String> collection = new ArrayList<String>(5);
Map<String,String> map = new HashMap<String,String>(32);
ArrayList随机遍历快,LinkedList添加删除快
集合遍历尽量减少重复计算
java
for(int i = 0,len = collection.size();i < len;i++){}
使用Entry遍历Map
java
for(Map.Entry<String,String> entry: map.entrySet()){
String key = entry.getKey();
String value = entry.getValue();
}
大数组复制用System.arraycopy
尽量使用基本类型而不是包装类型
不要手动调用System.gc()
及时消除过期对象的引用,防止内存泄漏
尽量使用局部变量,减少变量的作用域
尽量使用非同步的容器ArrayList VS Vector
尽量减少同步作用范围,synchronzied方法 VS 代码块
锁对象
java
public synchronized void f1(){
System.out.println("f1");
}
public void f2(){
synchronized(this){
System.out.println("f2");
}
}
锁类
java
public static synchronized void f3(){
System.out.println("f3");
}
public static void f4(){
synchronized(SynchronizedTest.class){
System.out.println("f4");
}
}
ThreadLocal缓存线程不安全的对象,SimpleDateFormat
尽量使用延迟加载
java
public class Singleton {
private Singleton(){}
private static class SingletonHolder{
private static Singleton instance = new Singleton();
}
public static Singleton getInstance(){
return SingletonHolder.instance;
}
}
尽量减少使用反射,加缓存
尽量使用连接池、线程池、对象池、缓存
及时释放资源、I/O流、Socket、数据库连接
慎用异常,不要用抛异常来表示正常的业务逻辑
String操作尽量少用正则表达式
replace VS repalceAll
split
日志输出注意使用不同的级别
java
log.debug();
log.info();
log.error();
日志中参数拼接使用占位符
java
log.info("accessCode:"+accessCode);// 不推荐
log.info("accessCode:{}",accessCode);// 推荐
推荐阅读:effect java