Skip to content

Java代码层优化

避免过度创建对象

尽量重用对象,避免频繁创建和销毁对象,特别是在循环或高频调用的代码中。

使用对象池或缓存来管理对象的生命周期,减少对象的创建开销。

使用局部变量

在方法中使用局部变量而不是实例变量,可以提高访问速度和减少内存开销。

避免在循环中重复访问成员变量,尽量将其缓存到局部变量中。

避免过度使用同步

同步会引入性能开销和潜在的死锁风险,尽量减少同步的范围和频率。

使用并发容器或原子类来替代传统的同步机制,以提高并发性能。

使用合适的数据结构和算法

根据实际需求选择合适的数据结构和算法,避免使用不必要的复杂度高的算法。

使用哈希表、树等高效的数据结构来提高查找和插入操作的性能。

优化循环和条件判断

尽量避免在循环中进行重复计算或重复判断。

使用更高效的循环方式(如增强型循环、流式操作等)来简化代码并提高性能。

减少方法调用和递归

减少不必要的方法调用和递归,尽量将逻辑内联到主调用方法中。

使用迭代替代递归,避免递归深度过大导致栈溢出。

优化IO操作

尽量减少IO操作的次数和大小,批量读写数据可以提高IO效率。

使用缓冲流来减少IO调用次数,提高IO性能。

使用性能调优工具

使用性能调优工具(如JProfiler、VisualVM等)来分析和定位性能瓶颈,优化关键代码段。

JVisualVM可视化监控

使用代码静态分析工具(如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