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