`
阅读更多

摘 要:诊断复杂的J2EE应用程序中的性能问题是一项艰巨任务。IT部门人员的责任是确保应用程序具备优越的性能且持续可用。出现性能问题时能够准确判断应归咎于特定应用程序组件,还是某个应用程序连接的后台或前端系统。本文着重讨论J2EE应用程序中常见的性能问题;分析引起这些性能问题的根本原因;提出如何准确诊断并迅速排除性能问题的可行性建议,以供参考。

前言

      如果需要您来诊断J2EE应用程序中的性能问题,Java系统的复杂性俨然将问题变为难以诊治的疑难杂症。为了准确查明问题所在,您需要对系统的故障征兆有一个全面的了解,还需要做大量的调研工作,提出适当的补救措施。本文着重讨论J2EE应用程序中常见的性能问题,分析引起这些性能问题的根本原因,提出如何准确诊断并迅速排除性能问题的可行性建议,以供参考。

故障征兆

      应用程序出现性能问题的征兆是什么?您所观察到的故障征兆诱导你对所有可能出现问题进行全面检索。拿起笔记本开始向人们收集数据。努力从假定推断中抽身出来,以确凿的证据认定系统的实际行为,查找引起性能问题的根本原因。系统中常见的故障征兆列表如下

      ■ 持续运行缓慢。时常发现应用程序运行缓慢。通过改变环境因子(如负载量、数据库连接数等)也无法有效提升整体响应时间。

      ■ 系统性能随时间的增加逐渐下降。在负载稳定的情况下,系统运行时间越长速度越慢。可能是由于超出某个阈值范围,系统运行频繁出错从而导致系统死锁或崩溃。

      ■ 系统性能随负载的增加逐渐下降。随着用户数目的增多,应用程序的运行越发缓慢。若干个用户退出系统后,应用程序便能够恢复正常运行状态。

      ■ 间发性的系统挂起或异常错误。有时候可能受负载或其它因素影响,当面不能完全显示,又或者是追踪到异常和堆栈的错误页,用户此时会看到系统挂起的情况。系统挂起的次数可能会稍有不同,然而即便是经过预烧(“burn in”)试验也无法完全消除。

      ■ 可预见的死锁。系统挂起或系统出错发生的频率随着时间的推移明显增多,直到系统完全死锁。通常借助自动重启的故障管理模式解决上述问题。

      ■ 系统突然出现混乱。系统正常运行,且在或多或少的一段时间内(譬如,可以是1小时也可以是3天)拥有一致优越的运行性能,却突然毫无征兆地出错甚至死锁。

 

性能问题的诊断为何如此困难

      特定使用模式下应用程序的性能优劣并无现成规则可循。(就严格意义上的实时工程而言,借助速率单调分析等方法的确可以完成这项工作,但已超出本文研究的范畴,在此不做讨论)。网络中是否存在另一个系统正在密集使用共享的后台服务,必将极大地影响系统的实际性能。系统性能或许还取决于JDBC驱动程序与数据库版本是否严格匹配。也可能出现这样的情况:开发人员三年前编写的代码,恰巧在这个时候出现特定类型的异常,而您急需的用以解决问题的回馈信息偏偏包含在那些异常当中。

      典型业务系统的性能呈现整体涌现性(emergent property)特征,是成千上万个变量(交互式)和决策共同作用的结果。就如同人的身体,是一个由众多联锁的组成部分和过程构成的整体。在文中我们采用统摄性模式以简化问题。

 

故障现象

      您所观察到的“疾病”征兆的根本原因是什么?是普通流感还是肺炎初期?是应用程序内部潜在的性能问题还是JVM外部进程出现了问题?下表是应用程序性能下降的常见原因列表,具体如下

<!---->

 

      

“疾病” 描述 征兆 原因或解决方法
内存泄漏呈线性增长 各单元(如每个事务或每个用户等)的内存泄漏,导致内存使用率随时间或负载的增加呈线性增长。系统性能随时间或负载的增加大幅下降,重启后系统可恢复正常 系统性能随时间的增加逐渐下降, 系统性能随负载的增加逐渐下降 虽然有许多外在因素存在(如各单元数据的链表存储、尚未回收的缓冲中的回收或增长操作等),但最为常见的原因还是资源泄漏
内存泄漏呈指数级增长 内存泄漏呈双倍增长,导致系统内存消耗随时间呈指数曲线变化 系统性能随时间的增加逐渐下降,系统性能随负载的增加逐渐下降 虽然有许多外在因素存在(如各单元数据的链表存储、尚未回收的缓冲中的回收或增长操作等),但最为常见的原因还是资源泄漏
导致无限循环的编码缺陷 线程在while语句返回值为真的情况下发生阻塞, 将最终演变成为CPU密集型和等待密集型或螺旋等待变量 可预见的死锁 需要进行侵入式循环切除
资源泄漏 JDBC语句、CICS事务网关连接等出现资源泄漏,引发Java桥接层和后台系统出现严重性能问题 系统性能随时间的增加逐渐下降, 可预见的死锁, 系统突然出现混乱 通常是由于遗漏了Finally模块,或者只是没有用close函数关闭代表外部资源的对象
外部瓶颈 后台或其它外部系统(如用户验证)运行缓慢,大大影响J2EE应用服务器及应用程序的运行速度 系统持续缓慢运行, 系统性能随负载的增加逐渐下降 向专家(包括可靠的第三方或系统管理员等)咨询特定外部瓶颈问题的有效解决方法
外部系统的过度使用 J2EE应用程序发送的请求过大过多,滥用后台系统资源 系统持续缓慢运行, 系统性能随负载的增加逐渐下降 消除冗余的工作请求,分批处理同类工作请求,把大请求细分为若干个小请求,调整工作请求或后台系统(例如为公共查询的关键字建立索引)等
频繁调用CPU密集型组件的编码缺陷 J2EE领域的通病是:些许编码缺陷或少量编码的交互失败,都会令CPU挂起,从而将数据流量速度降至蜗行 系统持续缓慢运行, 系统性能随负载的增加逐渐下降 最好的解决方法是将数据存储在本地缓存中,或者为执行算法配备高速缓冲存储器
桥接层本身存在的问题 桥接层(如JDBC驱动、CORBA到遗留系统的连接等)存在执行缺陷。需要不断对数据和请求作编组和取消编组操作,导致该层的数据流量速度降至蜗行。这种故障现象在早期阶段与外部瓶颈极为相似 系统持续缓慢运行, 系统性能随负载的增加逐渐下降 检查桥接层与外部系统的版本是否兼容。如果可能的话,对不同桥接供应商进行评估。通过重新规划设计系统架构,则可完全旁路桥接层
内部资源瓶颈:资源的过度使用或分配不足 内部资源(如线程、放入存储池的对象等)匮乏,却无法判断是正常情况下随负载增加而引起的资源过度使用,还是由于资源泄漏引起 系统性能随负载的增加逐渐下降, 间发性的系统挂起或异常错误 若因资源分配不足引起,则可依照最大预期负载值上调存储池的最大容量;若因资源过度使用引起,请参看本表“外部系统的过度使用”一栏
不断重试 失败请求的频繁重试(某些极端情况下将无休止重试) 可预见的死锁系统突然出现混乱 后台系统可能已经完全宕机。监控系统可用性对这样的状况有所帮助,也可以只是将多次重复尝试的请求从成功的请求中筛选出来
线程阻塞点 线程退回到无法完成的同步点,造成通信阻塞 系统性能随负载的增加逐渐下降, 间发性的系统挂起或异常错误, 可预见的死锁, 系统突然出现混乱 或许根本没有必要进行同步(只需对系统重新设计稍加改良),当然也可以定制一些外在的锁定策略(如读取器或写入器的读/写锁)
线程的死锁或活锁 通常只是“获取顺序”问题 系统突然出现混乱 解决方法选项包括主锁、即定的获取顺序以及银行家算法
网络饱和 等待时间长或基本无法将任何请求打包,导致系统异常停运、系统挂起或活锁等情况的出现 系统持续缓慢运行, 系统性能随负载的增加逐渐下降, 间发性的系统挂起或异常错误 如此棘手的问题正在侵蚀着网络系统,如果不及时升级系统的基础架构,提升网络及路由器的运行速度,将无法扼制日后类似问题的出现

 

分享到:
评论

相关推荐

    使用PerformaSure进行J2EE性能监控及瓶颈分析

    使用PerformaSure进行J2EE性能监控及瓶颈分析

    J2EE应用服务器性能优化方案

    常见性能问题 影响J2EE系统性能的可能因素 JVM 介绍 线程介绍 应用服务器性能调优简介 金蝶Apusic性能调优 Http服务性能调优 数据库连接池性能调优 线程池性能调优 工具使用说明 案例分析 定位系统性能瓶颈

    实用J2EE设计模式编程指南

    模式已成为收集、规范和分析某些情景中常见的问题的有效方法。本书介绍J2EE设计模式,及如何应用这些模式建立高质量应用程序,包括设计企业方案应用程序时使用的各种设计模式,并分章节介绍各个模式。本书有针对性地...

    J2EE中文版指南 CHM格式 带全文检索

    二 layerEJB代码分析 97 实体Bean类 98 CMP和BMP实现实体Bean的代码比较 98 访问(get和set)方法 98 持久性字段的访问方法 99 关系字段的访问方法 99 select方法 99 商业方法 100 实体Bean方法 100 Local Home接口 ...

    基于J2EE的在线考试系统构建探讨

    一、高校在线考试系统需求分析 在线考试系统的一般功能是将传统考试过程中的试卷组织、审定印制、传送收集、登记发放、评判归档各个环节缩小到一至两个环节,并尽量屏蔽所有人工直接干预考试的可能性。一般应在系统...

    系统性能 系统调优 垃圾回收 企业培训PPT

    为什么J2EE应用程序性能慢?...J2EE性能分析 如何优化循环、多分支和递归 如何调优多线程程序 J2EE应用程序性能调优分析 如何调优J2EE数据访问层 Jsp和servlet调优 常见应用服务器调优 Java垃圾回收机制分析

    软件性能测试过程详解与案例剖析

    第3章 性能计数器及性能分析方法 3.1操作系统计数器及分析 3.1.1Windows操作系统的主要计数器 3.1.2UNIX操作系统的主要计数器 3.1.3内存分析方法 3.1.4处理器分析方法 3.1.5磁盘I/O分析方法 3.1.6进程分析方法 ...

    DWR,Struts,Hibernate和Spring的J2EE架构开发大全

    基于J2EE轻量级框架的管理信息系统的分析和设计.pdf 基于JMS的企业即时通讯系统的设计与实现.pdf 基于Spring_Hibernate_Struts的高校设备招标评标管理信息系统.pdf 基于Spring+Struts+Hibernate的轻型架构实现生产...

    J2ee信贷客户管理系统

    本科毕业论文,j2ee,信贷客户管理,目 录 摘 要 I Abstract II 第一章 绪论 1 1.1 课题背景 1 1.2 系统设计目标 1 1.3 研究方法及设计思路 2 1.4 系统开发原则 3 1.5 可行性分析 4 1.6 本章小结 4 第二章 技术和...

    基于J2EE框架的个人博客系统项目毕业设计论...

    Java的产生与流行是当今Internet发展的客观要求,Java是一门各方面性能都很好的编程语言,它的基本特点是简单、面向对象、分布式、解释的、健壮的、安全的、结构中立的、可移植的、性能很优异的、多线程的、动态的,...

    快速开发框架完整版J2EE代码

    连接池监视:监视当期系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。 数据库建模:在线创建数据库表及字段,并可进行可视化配置各字段前端显示组件,表单即可显示对应组件。 定时任务计划:后台可视化配置...

    InfraRED使用指南

    InfraRED能够检测复杂结构的J2EE工程环境,能够提供详细的分析和报告,能够告知性能相关的问题,并能够引导你判断出问题的根本所在。如果你试图在没有与客户沟通的情况去确认一个性能问题,或者实际演示一个能使系统...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    Java的产生与流行是当今Internet发展的客观要求,Java是一门各方面性能都很好的编程语言,它的基本特点是简单、面向对象、分布式、解释的、健壮的、安全的、结构中立的、可移植的、性能很优异的、多线程的、动态的,...

    weblogic平台J2EE调优策略

    weblogic 调优策略,前 ...第五章 性能监控和性能分析 5.1 性能瓶颈 5.2 操作系统监控 5.3 数据库监控 5.4 WebLogic监控 5.4.1 JVM监控 5.4.2 Console监控 5.4.3 实用工具分析 5.5 应用程序分析 总结 参考文献 关于作者

    基于J2EE的B2C电子商务系统开发

    系统需求分析和设计:明确电子商务网站的功能需求,确定系统的基本架构和技术选型,设计数据库模型等。 搭建开发环境:安装和配置Java开发环境,如JDK、Eclipse等,以及相关的框架和组件。 前端页面设计和实现:...

    基于web的医患交流平台(J2EE版本)设计文档

    本文设计和实现一个基于Web的医患交流平台,使用J2EE技术,从需求分析开始,到概要设计、详细设计和实现,并有实现界面截图。是我们课程设计完成的项目。目录如下:(代码由于太大还无法上传……) 第一章 引言 1 ...

    JBOSS架构分析.doc

    基于我们以前的开发经验,我们发现了不同的J2EE应用服务器间的存在着巨大的性能和可扩展性差异。我们相信架构的设计是决定类似于性能和可扩展性等质量指标的重要因素。分析和展现JBoss架构模型有助于我们了解其内部...

    学生成绩管理系统-课程设计

    3 基于J2EE技术平台的学生成绩管理分析 18 3.1系统可行性分析. 18 3.1.1技术可行性 18 3.1.2经济可行性 18 3.1.3运行可行性 18 3.2系统需求分析 18 3.3系统整体说明 19 3.4系统模块的功能概述 19 4 系统总体设计 20 ...

    WebGate安装配置手册

    可以及时分析问题并解决; 可以24 小时实时监控整个应用系统; 可以保存实时性能数据(性能报告); 可以定量的分析当前系统性能,科学的决策是否需要升级系统硬件; 节省系统维护费用,提高维护效率; 最主要的是...

    开发高效率的J2EE企业应用

    对JavaEE企业应用系统的性能分析改善。 从网上下的PPT文件。

Global site tag (gtag.js) - Google Analytics