




已阅读5页,还剩24页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
如何用Java进行高性能网站开发 Java程序性能优化技巧 生成对象时 合理分配空间和大小 Java中的很多类都有它的默认的空间分配大小 对于一些有大小的对象的初始化 应该预计对象的大小 然后使用进行初始化 例如 我们在使用Vector 当声明Vectorvect newVector 时 系统调用 publicVector 缺省构造函数this 10 容量是10 缺省分配10个对象大小容量 当执行add方法时 可以看到具体实现为 publicsynchronizedbooleanadd Objecto modCount ensureCapacityHelper elementCount 1 elementData elementCount o returntrue Java程序性能优化技巧 生成对象时 合理分配空间和大小 privatevoidensureCapacityHelper intminCapacity intoldCapacity elementData length if minCapacity oldCapacity ObjectoldData elementData intnewCapacity capacityIncrement 0 oldCapacity capacityIncrement oldCapacity 2 if newCapacity minCapacity newCapacity minCapacity elementData newObject newCapacity System arraycopy oldData 0 elementData 0 elementCount 我们可以看到 当Vector大小超过原来的大小时 一些代码的目的就是为了做容量的扩充 在预先知道该Vector大小的话 可以指定其大小 避免容量扩充的开销 Java程序性能优化技巧 优化循环体 循环是比较重复运行的地方 如果循环次数很大 循环体内不好的代码对效率的影响就会被放大而变的突出 让我们看看下面的代码片 Vectorvect newVector 1000 for inti 0 i vect size i for循环部分改写成 intsize vect size for inti 0 i size i 如果size 1000 就可以减少1000次size 的系统调用开销 避免了循环体重复调用 Java程序性能优化技巧 优化循环体 再看如下的代码片 for inti 0 i 100000 i if i 10 9 每十次执行一次 改写成也可以提高效率 for inti 0 j 10 i 100000 i j if j 0 每十次执行一次j 10 所以 当有较大的循环时 应该检查循环内是否有效率不高的地方 寻找更优的方案加以改进 Java程序性能优化技巧 少用new初始化一个实例 尽量少用new来初始化一个类的实例 当一个对象是用new进行初始化时 其构造函数链的所有构造函数都被调用到 所以new操作符是很消耗系统资源的 new一个对象耗时往往是局部变量赋值耗时的上千倍 同时 当生成对象后 系统还要花时间进行垃圾回收和处理 当new创建对象不可避免时 注意避免多次的使用new初始化一个对象 尽量在使用时再创建该对象 如 NewObjectobject newNewObject intvalue if i 0 value object getValue Java程序性能优化技巧 少用new初始化一个实例 上面一段代码可以修改为 intvalue if i 0 NewObjectobject newNewObject Value object getValue 另外 应该尽量重复使用一个对象 而不是声明新的同类对象 一个重用对象的方法是改变对象的值 如可以通过setValue之类的方法改变对象的变量达到重用的目的 Java程序性能优化技巧 选择合适的方法调用 在Java中 一切都是对象 如果有方法 Method 调用 处理器先要检查该方法是属于哪个对象 该对象是否有效 对象属于什么类型 然后选择合适的方法并调用 可以减少方法的调用 同样一个方法 publicvoidCallMethod inti if i 0 return 其他处理 如果直接调用 inti 0 CallMethod i Java程序性能优化技巧 选择合适的方法调用 上面的代码 就应该写成 inti 0 if i 0 CallMethod i 不影响可读性等情况下 可以把几个小的方法合成一个大的方法 另外 在方法前加上final private关键字有利于编译器的优化 Java程序性能优化技巧 异常处理技巧 异常是Java的一种错误处理机制 对程序来说是非常有用的 但是异常对性能不利 抛出异常首先要创建一个新的对象 并进行相关的处理 造成系统的开销 所以异常应该用在错误处理的情况 不应该用来控制程序流程 流程尽量用while if等处理 在不是很影响代码健壮性的前提下 可以把几个try catch块合成一个 尽量使用局部变量和静态变量 尽量使用局部变量 调用方法时传递的参数以及在调用中创建的临时变量都保存在栈 Stack 中 速度较快 其他变量 如静态变量 实例变量等 都在堆 Heap 中创建 速度较慢 尽量使用静态变量 即加修饰符static 如果类中的变量不会随他的实例而变化 就可以定义为静态变量 从而使他所有的实例都共享这个变量 同步处理技巧 同步主要出现在多线程的情况 为多线程同时运行时提供对象数据安全的机制 多线程是比较复杂话题 应用多线程也是为了获得性能的提升 应该尽可能减少同步 另外 如果需要同步的地方 可以减少同步的代码段 如只同步某个方法或函数 而不是整个代码 Java程序性能优化技巧 尽可能的使用Java自身提供的API Java的API一般都做了性能的考虑 如果完成相同的功能 优先使用API而不是自己写的代码 如数组复制通常的代码如下 intsize 1000 String strArray1 newString size String strArray2 newString size for inti 0 i size i 赋值strArray1 newString Array i for inti 0 i size i 复制strArray2 newString String a Java程序性能优化技巧 尽可能的使用Java自身提供的API 上面那段代码 如果使用Java提供的API 就可以提高性能 intsize 1000 String strArray1 newString size String strArray2 newString size for inti 0 i size i 赋值strArray1 newString Array i System arraycopy strArray1 0 strArray2 0 size 复制同样的一个规则是 当有大量数据的复制时 应该使用System arraycopy Java程序性能优化技巧 尽量减少I O操作 输入 输出 I O 包括很多方面 我们知道 进行I O操作是很消耗系统资源的 程序中应该尽量少用I O操作 使用时可以注意 合理控制输出函数System out println 对于大多时候是有用的 特别是系统调试的时候 但也会产生大量的信息出现在控制台和日志上 同时输出时 有序列化和同步的过程 造成了开销 特别是在发行版中 要合理的控制输出 可以在项目开发时 设计好一个Debug的工具类 在该类中可以实现输出开关 输出的级别 根据不同的情况进行不同的输出的控制 尽量使用缓存 读写内存要比读写硬盘上的文件要快很多 应尽可能使用缓冲 以便直接从内存中读取数据 尽可能使用带有Buffer的类代替没有Buffer的类 如可以用BufferedReader代替Reader 用BufferedWriter代替Writer来进行处理I O操作 同样可以用BufferedInputStream代替InputStream都可以获得性能的提高 Java程序性能优化技巧 尽量不使用同步 Servlet是多线程的 以处理不同的请求 基于前面同步的分析 如果有太多的同步就失去了多线程的优势了 不用保存太多的信息在HttpSession中很多时候 存储一些对象在HttpSession中是有必要的 可以加快系统的开发 如网上商店系统会把购物车信息保存在该用户的Session中 但当存储大量的信息或是大的对象在会话中时 是有害的 特别是当系统中用户的访问量很大 对内存的需求就会很高 具体开发时 在这两者之间应作好权衡 Java程序性能优化技巧 清除SESSION 通常情况 当达到设定的超时时间时 同时有些Session没有了活动 服务器会释放这些没有活动的Session 不过这种情况下 特别是多用户并访时 系统内存要维护多个的无效Session 当用户退出时 应该手动释放 回收资源 实现如下 HttpSessiontheSession request getSession 获取当前Sessionif theSession null theSession invalidate 使该Session失效 缓存Home接口 EJB库使用EnterpriseBean的客户端通过它的Home接口创建它的实例 客户端能通过JNDI访问它 服务器通过Lookup方法来获取 JNDI是个远程对象 通过RMI方式调用 对它的访问往往是比较费时的 所以 在设计时可以设计一个类专门用来缓存Home接口 在系统初始化时就获得需要的Home接口并缓存 以后的引用只要引用缓存即可 Java程序性能优化技巧 使用快速度的Jdbc驱动 JDBCAPI包括两种实现接口形式 一种是纯Java实现的驱动 一种利用ODBC驱动和数据库客户端实现 具体有四种驱动模式 第一类 JDBC ODBC桥 再加上ODBC驱动程序 第一类JDBC驱动程序是JDBC ODBC桥再加上一个ODBC驱动程序 建议第一类驱动程序只用于原型开发 而不要用于正式的运行环境 桥接驱动程序由Sun提供 它的目标是支持传统的数据库系统 Sun为该软件提供关键问题的补丁 但不为该软件的最终用户提供支持 一般地 桥接驱动程序用于已经在ODBC技术上投资的情形 例如已经投资了Windows应用服务器 尽管Sun提供了JDBC ODBC桥接驱动程序 但由于ODBC会在客户端装载二进制代码和数据库客户端代码 这种技术不适用于高事务性的环境 另外 第一类JDBC驱动程序不支持完整的Java命令集 而是局限于ODBC驱动程序的功能 这种驱动方式也叫胖客户 主要用于低并发请求 大数据量传输的应用 Java程序性能优化技巧 使用快速度的Jdbc驱动 第二类 本机API 部分是Java的驱动程序 第二类JDBC驱动程序是本机API的部分Java代码的驱动程序 用于把JDBC调用转换成主流数据库API的本机调用 这类驱动程序也存在与第一类驱动程序一样的性能问题 即客户端载入二进制代码的问题 而且它们被绑定了特定的平台 第二类驱动程序要求编写面向特定平台的代码 主流的数据库厂商 例如Oracle和IBM 都为它们的企业数据库平台提供了第二类驱动程序 使用这些驱动程序的开发者必须及时跟进不同数据库厂商针对不同操作系统发行的各个驱动程序版本 另外 由于第二类驱动程序没有使用纯Java的API 把Java应用连接到数据源时 往往必须执行一些额外的配置工作 很多时候 第二类驱动程序不能在体系结构上与大型主机的数据源兼容 即使做到了兼容 效果也是比较差 Java程序性能优化技巧 使用快速度的Jdbc驱动 第一类和第二类驱动的比较 Java程序性能优化技巧 使用快速度的Jdbc驱动 第三类 面向数据库中间件的纯Java驱动程序 第三类JDBC驱动程序是面向数据库中间件的纯Java驱动程序 JDBC调用被转换成一种中间件厂商的协议 中间件再把这些调用转换到数据库API 第三类JDBC驱动程序的优点是它以服务器为基础 也就是不再需要客户端的本机代码 这使第三类驱动程序要比第一 二两类快 另外 开发者还可以利用单一的驱动程序连接到多种数据库 Java程序性能优化技巧 使用快速度的Jdbc驱动 第四类 直接面向数据库的纯Java驱动程序 第四类JDBC驱动程序是直接面向数据库的纯Java驱动程序 即所谓的 瘦 thin 驱动程序 它把JDBC调用转换成某种直接可被DBMS使用的网络协议 这样 客户机和应用服务器可以直接调用DBMS服务器 对于第四类驱动程序 不同DBMS的驱动程序不同 因此 在一个异构计算环境中 驱动程序的数量可能会比较多 但是 由于第四类驱动程序具有较高的性能 能够直接访问DBMS 所以这一问题就不那么突出了 这种驱动方式 主要用于高并发 低数据量请求的应用中 Java程序性能优化技巧 使用快速度的Jdbc驱动 第三类和第四类驱动的比较 Java程序性能优化技巧 使用Jdbc链接池为了提高访问数据库的性能 我们还可以使用JDBC2 0的一些规范和特性 JDBC是占用资源的 在使用数据库连接时可以使用连接池ConnectionPooling 避免频繁打开 关闭Connection 而我们知道 获取Connection是比较消耗系统资源的 Connection缓冲池 当一个应用程序关闭一个数据库连接时 这个连接并不真正释放而是被循环利用 建立连接是消耗较大的操作 循环利用连接可以显著的提高性能 因为可以减少新连接的建立 一个通过DataSource获取缓冲池获得连接 并连接到一个CustomerDB数据源的代码演示如下 Contextctx newInitialContext DataSourcedataSource DataSource ctx lookup jdbc CustomerDB Connectionconn dataSource getConnection password username Java程序性能优化技巧 缓存DataSorce一个DataSource对象代表一个实际的数据源 这个数据源可以是从关系数据库到表格形式的文件 完全依赖于它是怎样实现的 一个数据源对象注册到JNDI名字服务后 应用程序就可以从JNDI服务器上取得该对象 并使用之和数据源建立连接 通过上面的例子 我们知道DataSource是从连接池获得连接的一种方式 通过JNDI方式获得 是占用资源的 为了避免再次的JNDI调用 可以系统中缓存要使用的DataSource 即时关闭使用过的资源互联网应用系统一般是并发的系统 在每次申请和使用完资源后 应该释放供别人使用 使用完成后应该保证彻底的释放 如何利用Java开发高性能 高并发Web应用 架构选型在网站Web应用开发中 系统的整体架构是决定网站性能 稳定性 并发 可扩展性的关键因素 下面以世界著名网站应用软件提供商CoreMediaCMS系统为例 进行架构分析 如何利用Java开发高性能 高并发Web应用 架构选型CoreMediaCMS将整个应用分成四成架构 每一层都可以独立于其他层而正常运行 每一层都可以分布式布署 极大的提高了应用系统的稳定性 可扩展性 支持高并发的要求 每一次之前通过中间件Corba进行稳定的传输数据 如何利用Java开发高性能 高并发Web应用 开发框架的选型充分利用开源框架 可以大大提高开发效率 很多初级开发者 都采用DB JavaBean JSP这种初级的开发模式 而现在主要使用Struts Spring等MVC开发框架 常用开发框架构选型有 Struts Spring Webwork等 天极传媒选择的开发框架是 Struts Spring iBatis 在这个开发框架里 充分利用了Struts Spring各自己的优点 可以选择StutsMVC 也可以选择SpringMVC 如何利用Java开发高性能 高并发Web应用 分级存储 数据库数据分级存储 将经常访问的数据和访问频度低的数据 分别存放到不同的分区 甚至存放到不同的数据库服务器 以便合进分配硬盘I O及系统I O 网站内容发布之后 分级存储 任何一个大型的网站 一
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 等级考试都有哪几道题及答案
- 田径片段教学考试题及答案
- 装修企业如何管理办法
- 贷款新校区管理办法
- 苏泊尔融资管理办法
- 贷款产品限额管理办法
- 视频监控巡检管理办法
- 中办乡村振兴管理办法
- 组集体资产管理办法
- 专业用户投诉管理办法
- saas货运管理办法
- 纪念抗战胜利80周年1
- 物业客服管理知识培训课件
- 2026届广东省广州市高三上学期8月调研考试语文试题(含答案)
- 2025海南省老干部服务管理中心招聘事业编制人员6人(第1号)考试备考题库及答案解析
- 江苏省南通市如皋市2025-2026学年高三上学期开学考试数学试卷
- 2025年高一语文开学第一课指导课件
- 居民体重管理核心知识课件
- 2025年事业单位工勤技能-河北-河北计算机操作员二级(技师)历年参考题库含答案解析(5套)
- 2025-2026学年湘教版(2024)初中数学八年级上册教学计划及进度表
- 2025年江西省公安机关人民警察特殊职位招录考试(网络安全)历年参考题库含答案详解(5卷)
评论
0/150
提交评论