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字符串优化
- subString()方法的存在内存泄露问题(jdk1.6之前)
http://www.cnblogs.com/techyc/p/3324021.html
- split()方法支持正则表达式,在方法执行效率上有点低效,可以用StringTokenizer、indexOf()、charAt()去替代实现。
- 合理使用String、StringBuffer和StringBuilder
-
ArrayList和LinkedList性能比较(列表元素万级以上)
- 增加元素到列表尾端:同一级别
- 增加元素到列表任意位置:LinkedList性能更好
- 删除头部位置元素:LinkedList性能更好
- 删除中间位置元素:同一级别
- 删除尾部位置元素:同一级别
调优建议:
- 频繁做新增删除操作的,选LinkedList更佳
- 频繁做随机访问操作的,选ArrayList更佳
-
锁的优化
- 避免死锁
死锁的条件,如果要避免死锁则破坏其中任意一个条件即可
- 互斥条件:一个资源每次只能被一个进程使用
- 请求和保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放
- 不剥夺条件:进程已获得的资源,在未用完之前,不能强行剥夺
- 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源的状态
- 减少锁持有时间
- 减少锁粒度(ConcurrentHashMap)
- 锁分离
-
改善性能的技巧
- 慎用异常
- 使用局部变量
- 提取表达式,避免重复计算
- 使用buffer进行IO操作(BufferedOutputStream、BufferedInputStream)
- 避免使用正则表达式
- 复用对象,减少对象的创建
- 基本类型代替包装类