8.jvm字节码与java代码层面调优

常用代码优化方法

  • 尽量重用对象,不要循环创建对象,比如:for循环字符串拼接
  • 容器类初始化的时候指定长度
    List collection = new ArrayList(5);

tips: ArrayList底层是一个Object[]

Map map = new HashMap(32);

  • ArrayList随即遍历快,LinkedList添加删除快

tips: LinkedList底层是一个双向链表

  • 集合遍历尽量减少重复计算
    for (int i = 0, len = collection.size();i < len; i++) {}
    string.foreach

  • 使用Entry遍历Map
    for (Map.Entry entry: map.entrySet()) {
    String key = entry.getKey();
    String value = entry.getValue();
    }

  • 大数据复制用System.arraycopy

  • 尽量使用基本类型而不是包装类型

Integer i = 100; (会进行Integer.valueOf(i)) 装箱操作
System.out.println(i);

Integer i1 = 100 ;
Integer i2 = 100;
System.out.println(i1==i2); => true (-128~127范围内,使用cache)

Integer i1 = 1000 ;
Integer i2 = 1000;
System.out.println(i1==i2); => false(-128~127范围外,新创建Integer)

  • 不要手动调用System.gc() :不可控
  • 及时消除过期对象的引用,防止内存泄漏
  • 尽量使用局部变量,减少变量的作用域
  • 尽量使用非同步的容器ArrayList vs Vector(不建议) Vector是同步容器
  • 尽量减少同步作用范围,synchronized方法 vs 代码块(推荐)

tips:
synchronized 方法 和 synchronized (this) 效用一样
static synchronized void f3() 和 static 方法里 加synchronized 代码块效用一样

  • ThreadLocal缓存线程不安全的对象,SimpleDateFormat(构造成本高,提高效率)
  • 尽量使用延迟加载
  • 尽量减少使用反射,加缓存
  • 尽量使用连接池、线程池、对象池、缓存
  • 及时释放资源,I/O流、Socket、数据库连接
  • 慎用异常,不要用抛异常来表示正常的业务逻辑
  • String操作尽量少用正则表达式(replace-推荐 vs replaceAll- 正则)
  • 日志输出注意使用不同的级别
  • 日志中参数拼接使用占位符
    log.info("orderId:" + orderId);不推荐
    log.info("orderId:{}" + orderId);推荐

你可能感兴趣的:(8.jvm字节码与java代码层面调优)