记得在前些年,有一次,在客户那里做系统的性能分析和调整时,也是一点一点的分析,也没有什么头绪。有一个客户那边的负责人,对我们当时的一些做法表示不理解,当时他说了一句话:“做性能分析和调整,首先你得有自己的方法论,然后再谈具体的技术手段”。当时我们还觉得这个客户对我们有意见,觉得自己的做法没有什么不对的。但是在后面这些年里,我深刻的感觉到,这句话真是金玉良言。
其实我并不大喜欢充满哲学味道的东西,我喜欢简单直白的,但是,过于直白,直指目标的一些做法,让自己走了很多弯路,付了很多额外的代价,回过头来,再琢磨,原来那些简单又质朴的话,是不能违背的规律,是必须遵守的守则。
意识到这些之后,我特意针对性能分析和性能调优进行了很多的总结,尤其侧重在方法论,简单的描述一下吧。
第一:要判断性能分析的目标
是为了PK,还是为了实际使用?
你的真实场景,到底需要什么样的性能?
第二:你的周边环境,到底可以为你提供什么样的效率和性能?
例如数据库、例如网络
第三:业务的分析
业务流程是否可以优化?来提高效率?这个最好是对着每一个业务的流程图仔细思考。
第四:检查你的架构
软件实现层面的效率问题,很多都是由架构不良带来的,你即便每一行代码都精简,都无法扭转坏的架构带来的影响。
例如在哪里应当使用缓存,在哪里必须实时读数据库;在哪里需要等待(Sleep),在哪里可以立即进行;在哪里必须使用同步锁,在哪里可以并行或异步,等等等等。
第五:使用性能分析工具
一般来讲,一般不使用性能分析工具来判断架构是否存在问题,而是用来判断具体代码环节是否有问题。使用工具,理念就是“先查找到瓶颈,再进行优化”。实际上,应该是前边几条之后,再进行这一层面上的分析。
工具有几类,有Java自带的工具,有其他第三方工具。
Java命令行可以通过参数,直接进行CPU、内存的分析。当然,还有JConsole和VisualVM,可以用来辅助进行性能分析。还可以分析GC的活动。
第三方工具包括JProfile之类工具,可以进行更加细致的分析,分析结果直接转换成实时的曲线图,非常容易定位性能瓶颈。
使用工具,一般应该首先关注CPU(当然,除非你怀疑自己的系统有内存泄漏问题而进行排查,那样的话,优先关注内存),其次得关注线程(是否有过多的锁定和等待)。
关注CPU,直接定位到最消耗CPU的部分和方法,那么可以非常有针对性的把方法替换为高效实现,这是最简单的系统优化方法。
例如在某个系统分析时,发现Base64.encode消耗CPU非常多,于是在网上搜到了一个FastBase64的实现,替换上去,就发现系统性能马上提高一大截。
当然,最常见的是,解决了一个瓶颈,性能有所改进,又遇到另外一个瓶颈,每一步都非常艰难,每一步都有所进步。
关注线程,非常有利于发现配置不当引起的性能问题。例如数据库连接池配置的太小,例如线程池配置的太小,引起很多时候都在等待空闲连接(或空闲线程)的释放,发现哪里的问题,就可以通过调整配置的方式来改进系统。
关注内存,可以发现是否因为内存的不当使用,使系统很多时候在做GC,从而引起业务的暂停。
最后一点:要考虑系统特性的平衡
系统在某一个性能数据上,达到了一种极致。在此时,再继续做性能的优化,一定会牺牲系统的其他特性。在此时,如何折衷?是性能至上,继续高歌猛进,牺牲其他特性(例如可扩展性等等);还是优先考虑其他特性,接受当前的性能呢?这是所有架构师需要仔细考虑的问题。
说句题外话,在产品的设计、实现期间,又何尝不是如此,先要有了工作的方法论,再谈技术。没有方法论,产品变成一堆技术的杂烩,是一件可悲的事情。
相关推荐
《JAVA SMART系统-系统框架设计与开发》是一个深入探讨Java技术在构建智能系统中的应用的资源包,包含源代码和相关论文。这个压缩包旨在帮助开发者理解和实践如何使用Java技术来构建高效、灵活且可扩展的系统框架。...
Java编程方法论中,Spring Reactor、Reactor-Netty和Spring Webflux是现代Java开发中用于构建反应式应用程序的关键组件。Spring Reactor是响应式流(Reactive Streams)规范的实现,它提供了用于处理异步事件和数据...
* 可行性分析:本文档介绍了可行性分析的步骤和方法,包括技术可行性分析、经济可行性分析、安全可行性分析和操作可行性分析。 * 需求分析:本文档介绍了需求分析的步骤和方法,包括系统的主要功能、系统的实现目标...
### 校园新闻管理系统的设计与开发相关知识点解析 #### 一、系统概述 **校园新闻管理系统**是一款专门针对校园新闻信息进行高效管理的应用系统。它不仅涵盖了新闻信息的发布、编辑、删除等功能,还提供了用户交互...
Java论坛管理系统设计是一个涵盖多个IT领域知识的项目,主要基于Java编程语言,结合数据库管理和Web应用开发技术。这里我们将深入探讨这个系统的核心组成部分及其相关知识点。 1. **Java核心技术** - **Java基础**...
【Java编程语言特点】 Java编程语言是面向对象的...《Java编程方法论》这本书的详细内容,无疑为Java学习者和开发人员提供了宝贵的理论指导和实践案例,有助于他们深入理解和熟练运用Java,提升软件开发的效率和质量。
- 可行性分析:从技术、操作、经济和时间四个维度进行了可行性分析,确认了采用Java技术和B/S架构开发此系统的合理性。 - 系统性能分析:关注系统响应速度、稳定性、并发处理能力等方面,确保系统在高负载下仍能正常...
Java作业管理系统设计是一个涵盖多个IT知识...以上是对"java作业管理系统设计(源代码+论文)"项目中涉及的主要IT知识点的概述,实际开发过程中可能会有更多的细节和技术点,具体实现会根据项目需求和团队选择进行调整。
接着,文章提出了系统需求分析和系统设计的要求,最后对系统开发方法和技术实现进行了讨论。 根据所提供的片段,可以提炼出以下知识点: 1. **系统的基本功能**:文章提到了鲜花销售系统实现了一些基本功能,这些...
【Java开发-JSP仓储管理系统设计】是一个基于Java技术的Web应用程序,主要利用JSP(Java Server Pages)作为前端展示,结合Servlet和JavaBean等技术实现后台业务逻辑,用于管理仓库中的库存、进出货、订单等操作。...
综上,这篇论文全面介绍了使用Java、Spring Boot和Vue.js开发管理信息系统的方法,对于理解Web应用的开发流程和关键技术有重要参考价值。同时,它也强调了实践和理论结合的重要性,对于K12阶段的学生和毕业生来说,...
- **开发环境**:开发过程中使用了IDEA作为集成开发环境,并配合JDK1.8、Maven3.6、MySQL5.7等工具和技术进行开发。 - **服务平台**:使用Tomcat 8.0/9.0作为Web服务器运行系统。 - **数据库工具**:使用SQLyog/...
2. **系统设计**:介绍整体架构,包括前端Applet的设计,后端Java服务的搭建,以及数据库的设计,如用户信息存储、聊天记录存储等。 3. **技术选型**:说明选择Java和Applet的理由,以及这些技术在聊天系统中的具体...
综上所述,本系统采用先进的技术栈和科学的设计方法,实现了船舶监造过程的有效管理。未来的工作将集中在系统的进一步优化和完善上,以适应更多复杂场景的需求。此外,还将探索人工智能、大数据等新技术在船舶监造...
"Java 开发--JSP学生网上选课系统设计" 是一个基于Java技术,使用JSP(JavaServer Pages)开发的学生选课系统的项目。标题表明这个压缩包包含了一个完整的网上选课系统的设计与实现,涵盖了从源代码到论文再到答辩...
研究目的在于通过计算机技术,尤其是Java的jsp技术,配合MySQL数据库和Tomcat服务器,实现物流管理的信息化和网络化,提高管理效率,减少成本。 在技术方面,系统采用了MySQL数据库,这是一种关系型数据库管理系统...
【Java毕业设计:Java作业管理系统】是一个典型的计算机专业毕业设计项目,主要利用Java编程语言进行开发,涵盖了系统设计、数据库管理、用户交互等多个关键领域。这个项目不仅包含了完整的源代码,还附带了相关的...
11. **论文报告**: 论文部分会详细阐述项目的背景、需求分析、系统设计、实现方法、性能评估等方面,是理解整个系统设计与实现的重要参考资料。 以上是基于题目信息推测的网上花店系统开发涉及的核心技术与知识点,...
《Java论坛管理系统设计》是一个基于Java技术的网络社区平台,旨在提供一个互动性强、功能完善的线上讨论环境。这个系统的设计涵盖了软件工程的多个关键领域,包括需求分析、系统设计、编码实现、测试与维护等。以下...
需求设计是系统设计的重要步骤,需要对系统的功能和非功能性需求进行分析和设计。在本系统中,需求设计包括了对系统的功能需求和非功能性需求的分析,例如用户注册、课程播放、作业提交等功能需求,以及系统的可用性...