1. 1、资源是有限的 
  2. 无论是何种方式获得数据,最好还是采用分页。如果万一一个bug的出现,导致成上100万的数据查询出来,不光是一个java进程down掉的问题,可能整片都会出问题。 
  3. 事情的发生往往都是滚雪球的效应。 
  4. 2、依赖是未知的 
  5. 对于慢速系统或者不可靠系统、未知系统,做好做成异步。 
  6. 对于优先级很高的调用,采用异步通知或者等待的模式。对于优先级很低的调用,直接采用异步,无须等待,通过监控和告警监控。 
  7. CPU的速率很快,磁盘的转速很慢,一个依赖于文件系统的系统永远的速度只能达到磁盘响应的速度。 
  8. 3、线程安全与性能 
  9. 对于查询很多,写入很少的,还是直接采用HashMap,写入的时候采用lock锁 
  10. 对于写多,读少的,采用ConcurrentHashMap 
  11. 如果仅仅是一个线程操作这个数据,根本没有争用的情况,直接使用HashMap 
  12. ThreadLocal这样的对象,尽量不要开放给普通开发人员使用;这个对象的在线程的执行最前面,加上一个设置为空的操作,尽量减少ThreadLocal重复利用的问题。 
  13. 4、资源释放 
  14. 原则是那里获得那里释放。 
  15. 无论已经做了连接池的连接还是IO对象,全部采用那里获得那里释放的原则。 
  16. 同时,也要考虑释放多个资源,如果第一个出现异常,后面中断的问题。 
  17. 5、创建与复用 
  18. 对于采用分代并行垃圾回收算法的jdk,小对象的频繁创建和消耗对于性能的损耗几乎看不见。 
  19. 对于没有采用分代垃圾算法的jdk,特别是IBM的jdk,小心造成垃圾碎片,引起OOM。 
  20. 对于java的nio的网络通讯层面,ByteBuffer是一个能极大的减少内存创建的类,可以做到zero copy对象到网络层,极大的提高通讯的性能。 
  21. 6、字符串处理,日志级别的选择 
  22. 对于JDK1.5或者以上版本,使用+连接多个字符串,jdk编译器会自动采用StringBuilder进行优化,可以反编译看。很多文章或者书上写到,必须采用StringBuffer的方式, 
  23. 其实可以不用考虑,采用+的方式效率反而比采用StringBuffer高,StringBuffer的每个方法都采用了锁。 
  24. 日志级别在上线初期,可能会是info,甚至debug。在稳定一段时间后,一定要恢复到采用error级别。 
  25. 我们全部采用日志输出到cronolog的方式。 
  26. 很多地方写日志的方法很不正确。 
  27. log.debug("测试日志输出"+System.getProperties()); 
  28. 最好改成这样 
  29. if(log.isDebugEnable()){ 
  30. log.debug("测试日志输出"+System.getProperties()); 
  31. 按照java的习惯,即使日志不输出,但是字符串还是要拼接的,也对性能有损耗。 
  32. 7、原子操作与并发控制 
  33. 对于集群的并发控制,要么采用数据库,要么采用memcached。当然memcached性价比远远优于数据库。 
  34. 对于一个进程内部的并发,jdk1.5提供了很多很好使用的类。 
  35. 比如:AtomicLong,Lock等等 
  36. 8、灵活性和性能和可维护性的折中 
  37. spring是个好东西,看到使用几十个甚至上百个spring的配置文件,甚至在不同的目录或者jar里面,以后的维护是件及其麻烦的事情。 
  38. 为什么不能将这样配置统一到数据库中,进行统一的管理和配置。 
  39. 9、要有分布式和并发的观念,但是不要本末倒置 
  40. 这句话没错,但是要求所有的开发人员都要知道这么多细枝末节的东西,甚至要关系主机、数据库和网络环境岂不是增大了出现问题的可能性。 
  41. 开发人员需要投入绝大多数精力在业务上,而不是耗在无谓的系统怎么样部署、怎么样分布式上面。 
  42. 框架就是来支持这个的,给出一套开发规范,在框架上做出不符合这样规范的写法的错误捕获和提示,都是可以实施的。 
  43. 10、便利性的函数与性能的冲突 
  44. SimpleDateFormat就是一个典型的例子。jdk的代码是写的不错,但是也有写的很烂的代码。 
  45. 对于时间和日期的处理,我们一直都采用joda-time,性能好的很多。 
  46. 11、多级缓存和异步缓解异构系统的瓶颈 
  47. 还是上面的话,凡是不能控制的系统,就当成不信任的系统,尽量的异步,尽量的资源限制。 
  48. 12、运行期白盒化,模块可重置 
  49. 模块可重置,这个是个高科技,不知道采用什么办法做到的。 
  50. 如果是采用传统的ejb,支持热下线和热上线,做做demo可以,生产系统放到一边去。 
  51. 如果采用OSGi,本人没接触过。 
  52. 去年本人维护一个非常高可用的系统也对模块可重置想过很多,一直没有什么真正可在生产环境实施的方案。 
  53. 13、懒惰有时候是件好事 
  54. 这句话非常的好,加上一个限定条件就更好了,在有利工作的情况下懒惰。 
  55. 比如说:重复性的工作,懒得的人就会想出很多办法提高效率。 
  56.  
  57. 本人(msn:cauherk@hotmail.com)去年参与了5000万用户的系统的架构、设计和开发,采用了纯J2EE,集群、分布式、分库(横向和纵向)、分表技术实施。 
  58. 平均每天的业务量达到了400万笔交易。非常想和同道人一起讨论架构和技术问题。