> For the complete documentation index, see [llms.txt](https://rowkey-books.gitbook.io/pragmatic-java-engineer/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://rowkey-books.gitbook.io/pragmatic-java-engineer/chapter8-profile.md).

# 第八章 性能调优

实际的开发工作中，有时候会遇到程序突然变得响应缓慢或者进程消失的情况。这时候就需要对程序进行问题排查和调优，找出产生问题的根源，并进行优化。

一般来说，影响程序性能的因素主要有以下几个：

* 硬件配置
* 操作系统
* 应用程序

CPU、内存、硬盘等硬件配置从根本上决定了应用的性能，而对于网络应用，带宽也是影响其性能的关键因素。本章暂且抛开这些方面不讲，主要讲述针对操作系统和应用程序的调优方法。又可以分为：

* 系统调优: 针对操作系统的配置调优。
* Java调优：针对Java应用的调优，包括JVM和代码。
* 外部系统调优：针对应用程序依赖的外部系统如数据库、缓存、Web服务器等的调优。

共性的，无论是哪一个层面的调优，性能调优都可以分为以下三个步骤：

* 性能监控：此步骤可以描述为"我并不知道我要做什么"，在系统没有出现问题以前，是没有调优的动机和需求的（当然凭借经验预判除外）。需要监控机制来发现、暴露系统的性能问题。这里一般依赖于系统级别或者业务级别的监控工具。
* 性能分析：此步骤可以描述为"我知道我要做什么"，当性能监控发现问题的时候，那么调优的动机就来了。这时你就知道该要去解决什么样的问题了。带着这个问题去做各个层面的分析。此步骤则需要一些性能分析工具。
* 性能调优：此步骤可以描述为“我知道我需要知道什么了”，经过性能分析，你最终会知道是什么原因造成了问题，该需要怎么做才能够使得性能提高。这一步通常是需要系统、程序参数的调整、代码的重构优化等。

外部系统的调优在前面的各个章节中已经做了一些阐述，本章主要讲述系统调优和Java调优。
