记得在前些年,有一次,在客户那里做系统的性能分析和调整时,也是一点一点的分析,也没有什么头绪。有一个客户那边的负责人,对我们当时的一些做法表示不理解,当时他说了一句话:“做性能分析和调整,首先你得有自己的方法论,然后再谈具体的技术手段”。当时我们还觉得这个客户对我们有意见,觉得自己的做法没有什么不对的。但是在后面这些年里,我深刻的感觉到,这句话真是金玉良言。
其实我并不大喜欢充满哲学味道的东西,我喜欢简单直白的,但是,过于直白,直指目标的一些做法,让自己走了很多弯路,付了很多额外的代价,回过头来,再琢磨,原来那些简单又质朴的话,是不能违背的规律,是必须遵守的守则。
意识到这些之后,我特意针对性能分析和性能调优进行了很多的总结,尤其侧重在方法论,简单的描述一下吧。
第一:要判断性能分析的目标
是为了PK,还是为了实际使用?
你的真实场景,到底需要什么样的性能?
第二:你的周边环境,到底可以为你提供什么样的效率和性能?
例如数据库、例如网络
第三:业务的分析
业务流程是否可以优化?来提高效率?这个最好是对着每一个业务的流程图仔细思考。
第四:检查你的架构
软件实现层面的效率问题,很多都是由架构不良带来的,你即便每一行代码都精简,都无法扭转坏的架构带来的影响。
例如在哪里应当使用缓存,在哪里必须实时读数据库;在哪里需要等待(Sleep),在哪里可以立即进行;在哪里必须使用同步锁,在哪里可以并行或异步,等等等等。
第五:使用性能分析工具
一般来讲,一般不使用性能分析工具来判断架构是否存在问题,而是用来判断具体代码环节是否有问题。使用工具,理念就是“先查找到瓶颈,再进行优化”。实际上,应该是前边几条之后,再进行这一层面上的分析。
工具有几类,有Java自带的工具,有其他第三方工具。
Java命令行可以通过参数,直接进行CPU、内存的分析。当然,还有JConsole和VisualVM,可以用来辅助进行性能分析。还可以分析GC的活动。
第三方工具包括JProfile之类工具,可以进行更加细致的分析,分析结果直接转换成实时的曲线图,非常容易定位性能瓶颈。
使用工具,一般应该首先关注CPU(当然,除非你怀疑自己的系统有内存泄漏问题而进行排查,那样的话,优先关注内存),其次得关注线程(是否有过多的锁定和等待)。
关注CPU,直接定位到最消耗CPU的部分和方法,那么可以非常有针对性的把方法替换为高效实现,这是最简单的系统优化方法。
例如在某个系统分析时,发现Base64.encode消耗CPU非常多,于是在网上搜到了一个FastBase64的实现,替换上去,就发现系统性能马上提高一大截。
当然,最常见的是,解决了一个瓶颈,性能有所改进,又遇到另外一个瓶颈,每一步都非常艰难,每一步都有所进步。
关注线程,非常有利于发现配置不当引起的性能问题。例如数据库连接池配置的太小,例如线程池配置的太小,引起很多时候都在等待空闲连接(或空闲线程)的释放,发现哪里的问题,就可以通过调整配置的方式来改进系统。
关注内存,可以发现是否因为内存的不当使用,使系统很多时候在做GC,从而引起业务的暂停。
最后一点:要考虑系统特性的平衡
系统在某一个性能数据上,达到了一种极致。在此时,再继续做性能的优化,一定会牺牲系统的其他特性。在此时,如何折衷?是性能至上,继续高歌猛进,牺牲其他特性(例如可扩展性等等);还是优先考虑其他特性,接受当前的性能呢?这是所有架构师需要仔细考虑的问题。
说句题外话,在产品的设计、实现期间,又何尝不是如此,先要有了工作的方法论,再谈技术。没有方法论,产品变成一堆技术的杂烩,是一件可悲的事情。
相关推荐
内容包括需求分析、系统设计、关键技术实现、系统测试与分析等。论文不仅提供了理论支撑,还结合实际开发经验,对系统进行了深入的分析和优化。 **开题报告**:介绍了项目的背景、意义、研究目标、研究内容和方法。...
JAVA毕业设计影院管理系统的... 四、 论文撰写 本系统采用面向对象方法对系统进行分析与设计,并使用规范的UML图、表和专业术语来描述系统分析、设计、实现、测试过程与模型。并按照软件工程专业论文模版来撰写论文。
4系统设计及实现 4.1开发与运行环境 4.2数据库设计 4.3功能模块设计与实现 4.3.1服务器端功能设计 4.3.2客户端功能设计 4.4安全性设计 4.5界面实现 5测试 5.1测试概论 5.2测试环境及测试条件 5.3局域网...
**JAVA毕业设计-基于JAVA的文件传输系统(论文+源代码)** 本资源提供了一个完整的基于...通过学习和实践本资源中的内容,您将能够掌握Java文件传输系统的设计与实现方法,提升自己的编程技能和解决实际问题的能力。
由于服务器端性能的优劣直接影响到客户端用户的使用和体验效果,因此对WebGIS服务器端性能问题进行了深入研究,提出了JVM(Java虚拟机)性能调优、建立并改进缓存服务器、使用tmpfs(一种基于内存的文件系统)存储...
进行分析和详细设计,并用相关技术实现。 系统采用 BS 开发模式,以 MyEclipse6.0 作为开发平台,java 语言 为主要编程语言,结合 JSP、JavaScript、Html、SQL 等语言,以 Tomcat 为服务器和 SQL Server 2000 为后台...
该系统开发主要包括一个网络聊天服务器程序和一个网络聊天客户程序两个方面。前者通过Socket套接字建立服务器,服务器能读取、转发客户端发来信息,并能刷新用户列表。后者 通过与服务器建立连接,来进行客户端与...
第3章为需求分析部分,详细分析了该项目的技术可行性、经济可行性和操作可行性,并规定了系统设计规则和系统流程和逻辑。 第4章为系统概要设计,主要包括对该系统的整体概述、系统结构和数据库设计的详细介绍。 第5...
主要的研究方法:有面向对象的开发方法研究方法采用面向对象的设计开发方法进行系统的分析与实施,把系统各个独立运行的模块分别开发,使得模块内与模块间高度向高内聚低耦合靠拢。各模块采用服务器集群部署,使得...
第4章 系统设计 11 4.1 系统体系结构 11 4.2开发流程设计系统 12 4.3 数据库设计原则 13 4.4 数据表 15 第5章 系统详细设计 19 5.1管理员功能模块 20 5.2员工功能模块 23 第6章 系统测试 25 6.1系统测试的目的 25 ...
论文首先论述了系统的研究背景和目标,并对所用到开发工具与关键技术做了简单的介绍。接着对系统进行需求分析,分析了系统要实现的功能,给出了系统的用例图和时序图,确定了系统的功能模块,并画出相应的模块图。...
2.3系统设计中应注意的问题及解决方法 3 2.3.1应注意的问题 4 2.3.2解决办法 4 2.4系统使用技术与开发环境平台分析 4 2.4.1 Jsp技术介绍 4 2.4.2 Mysql数据库 4 2.4.3 SpringBoot框架介绍 5 2.4.4 tomcat服务器介绍 ...
在系统设计和开发过程中,要充分考虑系统当前和将来可能承受的工作量,使系统的处理能力和响应时间能够满足信息处理的需求。 2、 系统的开放性和系统的可扩充性:系统在开发过程中,应该充分考虑以后的可扩充性。...
第3章为需求分析部分,详细分析了该项目的技术可行性、经济可行性和操作可行性,并规定了系统设计规则和系统流程和逻辑。 第4章为系统概要设计,主要包括对该系统的整体概述、系统结构和数据库设计的详细介绍。 第5...
第二章 系统开发关键技术 6 2.1 JAVA技术 6 2.2 MyEclipse开发环境 6 2.3 Tomcat服务器 7 2.4 Spring Boot框架 7 2.5 MySQL数据库 7 第三章 系统分析 10 3.1 系统可行性研究 10 3.2 性能分析 11 3.3 业务流程分析 ...
开发中利用了计算机网络编程的基本理论知识,如TCP/IP协议、客户端/服务器端模式(Client/Server模式)、网络编程的设计方法等。在网络编程中对信息的读取、发送,是利用流来实现信息的交换,其中介绍了对实现一个...
基于与 Java 和 MySQL 的精品课程网站以 JSP、Servlet 和 Java Bean 为基础,采用 MySQL 数据库及 Tomcat 服务器技术进行网站设计和开发。首先对相关的 Java Web 成功案例进行学习,再根据师生的使用需求,对精品...