8.jvm字节码与java代码层面调优
2020-03-15 本文已影响0人
心释逍遥lx
常用代码优化方法
- 尽量重用对象,不要循环创建对象,比如:for循环字符串拼接
-
容器类初始化的时候指定长度
List<String> collection = new ArrayList<String>(5);
tips: ArrayList底层是一个Object[]
Map<String,String> map = new HashMap<String,String>(32);
- ArrayList随即遍历快,LinkedList添加删除快
tips: LinkedList底层是一个双向链表
-
集合遍历尽量减少重复计算
for (int i = 0, len = collection.size();i < len; i++) {}
string.foreach -
使用Entry遍历Map
for (Map.Entry<String,String> 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);推荐