1、Java高性能系统常见的设计与优化-精品文档2022-10-53u内存访问比硬盘I/O访问快万倍u内存访问比网络I/O访问快百倍u网络I/O访问比硬盘I/O访问快百倍u首先首先降低硬盘I/O访问次数,如硬盘数据库访问u其次其次降低进程间通信I/O次数,尤其是远程进程间通信I/O次数,如JDBC数据库访问u降低CPU和内存等资源的占用42022-10-5u优先使用BEA JRockit,而不是使用SUN JVMu如果使用SUN JVM,使用-server即Server版的JVMu根据Cache需要,可调整JVM的Heap Size,如-Xmx2048m,否则很可能出现Out of Memory异
2、常。另外,Max Heap Size最好不要超过物理内存的1/2u其他JVM选项请参见产品手册,可输入java help查看具体选项62022-10-5u数据模型设计应根据性能权衡降低表连接数量,一般每个每个SQL中中最好不要超过最好不要超过3个表的连接个表的连接,否则性能下降很大u使用DBMS的Partition特性特性加快大数据量表的SQL操作性能,详细信息可参见Oracle Partition部分文档u根据SQL建立索引建立索引,索引列与SQL中的列要有一定的对应关系,详细信息可参见Oracle 性能优化部分文档u对于统计查询,可考虑使用物化物化视图视图(Materialized Vie
3、ws)8u使用JDBC连接池连接池,物理连接建立对性能影响很大,对于并发很高的应用,可调高可调高JDBC连接池连接池的大小的大小,如设为192u尽量降低对数据库的访问次数尽量降低对数据库的访问次数,否则性能影响很大u对于写操作,尽量使用批量批量(batch)写写的方式,但每个事务中的SQL不要超过500;u对于查询请使用预取预取(PreFetch)u使用prepare statement,避免DBMS对SQL重复的解析与编译uSQL不要太复杂,尤其是连表查询的表最好不要超过3个uWhere in的列表最好不要超过500个92022-10-5u使用硬件负载均衡器提高系统的并发用户数支持(连接复用
4、)u使用软件负载均衡器负载均衡器提高系统的并发用户数支持(连接复用),如Apache,请参见Tomcat、JBOSS等Apache的AJP支持部分。单节点4CPU的应用服务器可支持10,000并发HTTP用户11u请尽量使用异步通信请尽量使用异步通信,可使用ActiveMQ消息中间件u如果基于Socket开发,请使用异步异步I/O,比同步I/O一般快2倍,Apache即基于异步I/O实现u远程通信可考虑RMI,性能往往比基于XML较好u如果是基于XML的消息包,请使用个SAX或或StAX接口接口,请不要使用DOMu如果使用SOAP,请使用开源库XFire,一般来说其性能是Apache Axis
5、的3倍以上,并MyEclipse直接支持XFire;u请尽量降低远程进程间通信次数请尽量降低远程进程间通信次数u在降低远程进程间通信次数的同时在降低远程进程间通信次数的同时降低消息包的大小降低消息包的大小122022-10-5u如果需要使用线程池线程池,请使用JDK1.5的java.util.concurrent包中的ThreadPoolExecutor u多线程同步多线程同步也可使用java.util.concurrent.locks和java.util.concurrent.atomic中的封装u如果并发的定时调度任务很多,请使用开源库开源库Quartz,可支持上万个定时任务u使用Cach
6、e大幅降低I/O访问次数,可基于开源库OSCache或JDK1.5的java.util.concurrent包中的ConcurrentHashMap来封装u对于高级的大数据量实时处理,可使用Oracle TimesTen内存数据库技术内存数据库技术14u中间层请尽量是尽量是stateless方式方式,而不是stateful方式,降低session状态数据的cluster复制u需要熟悉需要熟悉java.util包中的各种数据结包中的各种数据结构的适用场景构的适用场景,如HashMap适用于单记录的快速操作等u避免使用避免使用Entity EJB和和stateful EJBu尽量避免分布式事务,而是使用本尽量避免分布式事务,而是使用本地事务地事务u尽量降低负载均衡时节点间的数据尽量降低负载均衡时节点间的数据复制复制15Lets Innovate Together谢谢!2022-10-5