Java应用性能优化

October 4, 2021

应用性能优化是软件开发中非常重要的环节,是中高级的软件开发能力,也是咨询服务的重点内容。 本文以Java作为开发语言展开。在国内Java语言还是企业应用,互联网应用开发的首选语言。

很多朋友们提出过问题,在Java应用性能优化方面,有哪些重要的技术内容呢。我做了如下梳理: 按照开发和运维阶段,分为三大模块:应用设计优化、Java 性能调优、操作系统和云计算性能优化。

模块A 应用设计优化

我们在开发应用时,会进行软件架构设计。架构师需要结合应用需求,来进行整体软件设计,包括要考虑线程并发,IO异步,分布式,如何访问数据库,使用集群并考虑容错等因素。 这些知识点既是为架构设计,又是为软件优化,可以说前期的架构设计,会决定最终应用系统性能60~80%性能比重。 Java 性能因素的绝大部分由架构设计决定的,少数部分由部署阶段的性能调优实现。

应用设计优化有其原则和时机,一般来说,基于Java的应用会基于成熟的架构开发,如Spring框架,这些框架已经经过了数以万计的开发团队使用和打磨,成熟稳定。这样开发者不用花太多时间在底层细节的处理和优化上,当然架构师和高级开发人员对框架的熟悉是很有必要的,方便使用,扩展和排错。 Java语言中的线程并发和IO机制是核心技术内容,开发者应当非常熟悉这些基础知识并熟练运用。 对于分布式微服务,我们需要了解分布式技术原理和设计,对分布式中间件熟练应用,熟悉集群的原理和配置。管理微服务,通过可探测性来监控其性能并持续优化。

模块内容:

一、应用优化概述

  1. 优化原则和时机
  2. 架构和设计的重要性
  3. 不要过度优化

二、线程并发

  1. Java 线程原理简述
  2. Java 并发框架
  3. 线程池设计
  4. 并发设计实践

三、异步模型

  1. 同步异步选择和程序员心智
  2. Java NIO 和 Netty 网络框架
  3. Spring 的异步响应式编程
  4. JavaEE 的异步化知识点

四、微服务设计

  1. 经典微服务框架
  2. Spring MVC reactive
  3. Vertx 框架优化设计
  4. 数据访问层设计原则
  5. Web 接入
  6. 集群性能优化

五、编程优化

  1. Java 设计模式运用
  2. 安全和事务方面的考虑
  3. 可探测性
  4. APM 监控性能

模块B Java 性能调优

涉及 Java 性能优化的各个方面,重点阐述 JVM 性能和中间件调优策略。了解Java 原理和技术,如何充分利用现代硬件和操作系统、衡量 Java性能,帮助团队中各种角色的技术人员了解 Java 性能分析和调优方法,编写并部署更高效的 Java 应用程序。

Java虚拟机性能分析,主要从几个部分展开:线程分析,堆和对象分析,GC分析。当然系统整体CPU,内存,IO,数据库,网络等也是重要考察的。 Java有非常丰富的工具,能理解并运用这些工具,能帮助开发者事半功倍。JVM运行时环境的充分了解,以及应用层中间件的分析调优,也是重点学习内容。

模块内容:

一、性能调优初步

  1. 系统资源限制 2 调优分析层面 3 调优时机 4 基本工具一览 5 Linux 工具

二、 Java 调优

  1. JDK 命令行工具
  2. 实践案例

三、 JVM 调优

  1. 性能相关概览
  2. 虚拟机参数使用
  3. 内存监控
  4. 垃圾收集
  5. 选择垃圾收集算法
  6. 调优方法
  7. 类加载
  8. JIT 编译优化
  9. 线程监控
  10. 磁盘 IO
  11. CPU 记录和调度

四、应用层中间件调优

  1. 线程池
  2. 数据库连接池
  3. 组件池
  4. Web 容器
  5. 状态缓存池
  6. 消息部分
  7. 负载均衡
  8. 日志记录和优化

五、 高级工具

  1. JVMTI 接口
  2. JMC GUI
  3. 使用 JFR
  4. JitWatch
  5. Byteman

模块C 操作系统和云计算性能优化

包括操作系统和容器层面的性能调优知识点,介绍系统级调优的方法和工具。对于目前云原生开发,也从架构设计和部署运维角度进行分析说明。对于跨平台跨语言的开发场 景,使用 ServiceMesh 是服务治理的一个良好选择。

Java开发的应用程序,在很多场景下性能问题是由运行环境引起的,这就需要我们具备操作系统和云计算设施服务技术知识,能够进行系统级别排错和调用。 系统环境对应用进行分析,除了前面提到的可观测性的运维监控外,还有静态监控和动态监控等技术方法。现代操作系统,如Linux已经在内核级别提供了丰富的扩展机制,通过工具和开发环境,可以进行系统和应用级别的分析和调优。

比如Systemtab是操作系统经典的动态追踪工具,在RHEL6/7都是作为主打系统分析工具提供,红帽公司的系统架构师提供技术支持,也有对应的培训课程。 BPF(Berkeley Packet Filter)在设计之初是提升网络包过滤工具的性能,2014年并入Linux内核主线,这样BPF变成了一个更通用的执行引擎,可以完成多项性能分析的任务。BCC(BPF Compiler Collection)提供了使用BPF对事件进行观测的库函数,bpftrace展示具体的观测操作以及数据是如何被处理的。RHEL8中Systemtab和BPF都作为应用调试能力工具使用。

通过使用上述强有力的工具,可以对应用所处的运行环境进行分析诊断,找到问题所在。 在云环境中,结合容器技术,一种良好的部署架构就是采用ServiceMesh方式,将所有非业务能力都从业务应用进程剥离分开,能够充分利用云原生服务平台带来的好处。

模块内容:

一、性能优化总体概述

  1. 性能优化系统性工程
  2. 操作系统优化概述
  3. 云计算设施优化概述
  4. 应用层优化综述

二、数据采集和展现

  1. 数据收集方法和工具
  2. 数据报表和图表工具

三、操作系统调优

  1. 系统性能瓶颈检测
  2. 内核参数调优
  3. 限制服务资源占用
  4. 工具使用范例
  5. 应用调试器使用
  6. 配置内核模块底层分析

四、云计算环境应用调优

  1. 容器环境性能因素
  2. 应用间访问性能调优
  3. 云原生应用设计模式
  4. 开发运维环境工具辅助
  5. 云基础设施

五、 ServiceMesh

  1. SideCar模式对应用架构的影响
  2. 设计性能考虑
  3. Istio,Knative 等平台性能分析
  4. 对应用层的影响分析
  5. 云原生其他服务

应用性能调优,从本质上来说,和软件应用设计开发是一体的,需要不断迭代优化和打磨更新,是个持续的过程。 软件系统的系统整体把控和代码和配置信息的可读可维护性成为关键。

性能监控和软件分析,就如同现实社会商业运作一样,在一个有序的大系统之中运行。当有事件发生时,有相应的主体接收并处理事件(Event),执行相应的动作(Function)。如果是和外部打交道,就是进行消息通信(分布式调用)。软件架构都可以用这种模型去理解和设计,所有的架构模型,无论是单体还是微服务,都是这种社会化模型的一个抽象。

软件性能分析和调优,是一项技术,更是解决问题的一种方法论。希望可以和更多的朋友深入探讨,期待着多交流。