本文做者是一名有10多年经验的高级系统架构师,他的主要专业领域是Java EE、中间件和JVM技术。他在性能优化和提高方面也有很深入的看法,下面他将和你们分享一下常见的10个影响Java EE性能问题。 java
容量规划是一个全面的和发展的过程标准,预测当前和将来的IT环境容量需求。制定合理的容量规划不只会确保和跟踪当前IT生产能力和稳定性,同时也会确保新项目以最小的风险部署到现有的生产环境中。硬件、中间件、JVM、调整等在项目部署以前就应该准备好。 数据库
“没有规矩,不成方圆”。第二个比较广泛的缘由是Java EE中间件或者基础架构不规范。在项目初始,新平台上面没有制定合理的规范,致使系统稳定性差。这会增长客户成本,因此花时间去制定合理的Java EE中间件环境规范是必须的。这项工做应与初始容量规划迭代相结合。 缓存
各位对“java.lang.OutOfMemoryError”这个错误信息是否是很熟悉呢?因为JVM的内存空间过分消耗(Java堆、本机堆等)而抛出的异常。 安全
垃圾收集问题并不必定会表现为一个OOM条件,过分的垃圾收集能够理解成是JVM GC线程在短期里进行轻微或超量收集集合数据而致使的JVM暂停时间很长和性能降低。可能有如下几个缘由: 性能优化
建议: 服务器
致使Java EE性能差的第四个缘由是高分布式系统,典型案例是电信IT环境。在这个环境中,一个中间件领域(例如,服务总线)不多会作全部的工做,而仅仅是把一些业务“委托”给其余部分,例如产品质量,客户资料和订单管理,到其余Java EE中间件平台或遗留系统中,如支持各类不一样的负载类型和通讯协议的大型机。 网络
这样的外部系统调用意味着客户端的Java EE应用程序触发建立或重用套接字连接从外部系统中读写数据。根据业务流程的实施和实现能够配置成同步调用或异步调用。须要注意的是,响应时间会根据外部系统的稳定情况进行改变,因此经过适当的使用超时来保护Java EE应用程序和中间件也是很是重要的。 架构
下面这3种状况是常常出现问题和性能下降的地方: 异步
最后,建议多进行负面测试,这意味着须要“人为”创造产生这些问题的条件,用来测试应用程序和中间件之间是如何处理外部系统错误。 分布式
你们可能会对这一个感到惊奇:数据库问题。大多数Java EE企业系统是依赖关系型数据库处理复杂的业务流程。一个基础扎实稳固的数据库环境能够确保IT环境有规模的增加,来支持日益不断扩大的业务。
在实际中,与数据库相关的性能问题是很常见的。因为多数数据库事务处理都是由JDBC数据源执行的(包括关系持久化API,例如Hibernate)。而性能问题最初都会表现为线程阻塞。
如下是我在10年的工做中,常常出现的关于数据库方面的问题(以Oracle数据库为例):
建议:
下面关注的是比较严重的Java EE应用程序问题。关于特定应用程序性能问题,总结了如下几个点:
通常Java EE中间件都已经够用了,只是缺乏必要的优化。大多数Java EE容器都能有多种方案供你的应用程序和业务进程选择。
若是没有进行适当的调整和实践,那么Java EE容器可能会处于一种消极的状态。下图是视图和检查列表示例:
缺少监控,并不会带来实际性能问题,但它会影响你对Java EE平台性能和健康情况的了解。最终,这个环境能够达到一个破发点,这可能会暴露出一些缺陷和问题(JVM的内存泄漏,等等)。
以个人经验来看,若是一开始不进行监控,而是运行几个月或者几年后再进行,平台稳定性将大打折扣。
也就是说,改善现有的环境永远都不会晚。下面是一些建议:
这个问题常常在有太多的Java EE中间件环境随着JVM进程被部署到现有硬件上面时看到。太多的JVM进程对有限的物理CPU核心来讲是一个真正的程序性能杀手。另外,随着客户端业务的增加,硬件方面也须要再次考虑。
最后一个影响性能问题的是网络,网络问题时不时的都会发生,如路由器、交换机和DNS服务器失败。更常见的是在一个高度分散的IT环境中按期或间歇性延迟。下面图片中的例子是一个位于同一区域的Weblogic集群通讯与Oracle数据库服务器之间的延迟。
间歇或按期的延迟会触发一些重要的性能问题,以不一样的方式影响Java EE应用程序。
JDBC行数据“预取”、XML数据压缩和数据缓存能够减小网络延迟。在设计一个新的网络拓扑时,应该仔细检查这种网络延迟问题。
但愿本文可以帮助您理解一些常见的性能问题和压力点,每一个IT环境都是独一无二的,因此文中提到的问题不必定会是您遇到的,您能够把您遇到的问题拿出来和你们一块儿分享一下!