Java性能调优(二)

代码调优

  • 闻到坏代码的味道

 1 ExecutorService executor = Executors.newFixedThreadPool(5);
 2 final HashMap<String, String> map = new HashMap<String, String>(2);
 3 for(int i=0;i<10;i++){
 4     executor.execute(new Runnable(){
 5         @Override
 6         public void run() {
 7             for(int j=0;j<5000;j++){
 8                 map.put("test"+j, "test");
 9             }
10         }
11     });
12 }

执行以上代码,有一定的几率会出现CPU一直保持在100%,无法降下来,原因是HashMap本身是非线程安全的类,具体原因可以查看这里:http://blog.csdn.net/xuefeng0707/article/details/40797085

  • String字符串优化

  1. subString()方法的存在内存泄露问题(jdk1.6之前)

      http://www.cnblogs.com/techyc/p/3324021.html

  1. split()方法支持正则表达式,在方法执行效率上有点低效,可以用StringTokenizer、indexOf()、charAt()去替代实现。
  1. 合理使用String、StringBuffer和StringBuilder
  • ArrayList和LinkedList性能比较(列表元素万级以上)

  1. 增加元素到列表尾端:同一级别
  2. 增加元素到列表任意位置:LinkedList性能更好
  3. 删除头部位置元素:LinkedList性能更好
  4. 删除中间位置元素:同一级别
  5. 删除尾部位置元素:同一级别

      调优建议:

  1. 频繁做新增删除操作的,选LinkedList更佳
  2. 频繁做随机访问操作的,选ArrayList更佳
  • 锁的优化

  • 避免死锁

     死锁的条件,如果要避免死锁则破坏其中任意一个条件即可

  1. 互斥条件:一个资源每次只能被一个进程使用
  2. 请求和保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放
  3. 不剥夺条件:进程已获得的资源,在未用完之前,不能强行剥夺
  4. 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源的状态
  • 减少锁持有时间
  • 减少锁粒度(ConcurrentHashMap)
  • 锁分离
  • 改善性能的技巧

  1. 慎用异常
  2. 使用局部变量
  3. 提取表达式,避免重复计算
  4. 使用buffer进行IO操作(BufferedOutputStream、BufferedInputStream)
  5. 避免使用正则表达式
  6. 复用对象,减少对象的创建
  7. 基本类型代替包装类
posted @ 2017-03-14 09:29  leafsunday  阅读(93)  评论(0编辑  收藏  举报