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