Java程序性能优化——性能调优层次

为了提升系统性能,开发人员可以从系统的各个角度和层次对系统进行优化。除了最常见的代码优化外,在软件架构上、JVM虚拟机层、数据库以及操作系统层都可以通过各种手段进行调优,从而在整体上提升系统的性能。

设计调优

设计调优处于所有调优手段的上层,它往往需要在软件开发之前进行。在软件开发之初,软件架构师就应该评估系统可能存在的各种潜在的问题,并给出合理的设计方案。由于软件设计和架构对软件整体有决定性的影响,所以,设计调优对系统性能的影响也是最大的。如果说,代码优化、JVM优化都是对系统微观层面上“量”的优化,那么设计优化就是对系统在宏观层面上“质”的优化。

设计优化的一大显著特点是,它可以规避某一个组件的性能问题,而非改良该组件的实现。比如,系统中组件A需要等待某事件E才能出发一个行为。如果组件A通过循环监控不断检测事件E是否发生,其监测行为必然会占用部分系统资源,因此,开发人员必须在监测频率和资源消耗间获取平衡。如果监测频率太低,虽然减少了资源消耗,但是系统实时反应性就会降低。如果进行代码层的调优,就需要优化监测方法的实现以及求得一个恰当的监测频率。

而若将此问题预留在设计层解决,便可以使用事件通知的方式将系统行为进行倒置。如果使用观察者设计模式,在事件E发生的时刻,由事件E通知组件A,从而触发组件A的行为。这种设计方法弃用了存在性能隐患的循环监控,从根本上解决了这个问题。

从某种程度上说,设计优化直接决定了系统的整体品质。如果在设计层考虑不周,留下太多问题隐患,那么这些“质”上的问题,也许无法再通过代码层的优化进行弥补。因此,开发人员必须在软件设计之初,认真仔细考虑软件系统的性能问题。

进行设计优化时,设计人员必须熟悉常用的软件设计方法、设计模式、基本性能组件和常用优化思想,并将其有机地集成在软件系统中。

注:一个良好的系统设计可以规避很多潜在的性能问题。因此,尽可能多花费时间在系统设计上,是创建高性能程序的关键。

 

代码调优

代码调优是在软件开发过程中,或者在软件开发完成后,软件维护过程中进行的对程序代码的改进与优化。代码优化涉及诸多编码技巧,需要开发人员熟悉相关语言的API,并在合适的场景中正确使用相关的API和类库。同时,对算法、数据结构的灵活使用,也是代码优化的重要内容。

虽然代码优化时从微观上对性能进行调整,但是一个“好”的实现和一个“坏”的实现对系统的影响也是非常大的。比如,同样作为List的实现,LinkedList和ArrayList在随机访问上的性能却可以相差几个数量级;又如,同样是文件读写的实现,使用Stream方式与Java NIO的方式,其性能可能又会相差一个数量级。

因此,虽然与设计优化相比,笔者将代码优化称为在微观层面上的优化,但是它却是对系统性能产生最直接影响的优化方法。

 JVM调优

由于Java软件总是运行在JVM虚拟机之上,对JVM虚拟机进行优化也能在一定程度上提升Java程序的性能。JVM调优通常可以在软件开发后期进行,如在软件开发完成,或者在软件开发的某个里程碑阶段。

作为Java软件的运行平台,JVM的各项参数将会直接影响Java程序的性能。比如,JVM的堆大小、垃圾回收策略等。

要进行JVM层面的调优,需要开发人员对JVM的运行原理和基本内存结构有一定了解。如,堆内存的结构,GC的种类等。然后,依据应用程序的特点,设置合理的JVM启动参数。

数据库调优

对绝大部分应用系统而言,数据库是必不可少的一部分。Java程序可以使用JDBC的方式连接数据库。对数据库的调优可以分为3个部分:

□在应用层对SQL语句进行优化;

□对数据库进行优化;

□对数据库软件进行优化。

在应用层优化数据库访问,涉及大量的编程技巧。比如,当使用JDBC进行查询操作时,对于大量的拥有相同结构的SQL查询,可以使用PreparedStatement代替Statement,以提高数据库的查询效率;在Select语句中,显示指定要查询的列名,避免使用“*”。

在对数据库进行优化时,主要目的是建立一个具有良好表结构的数据库。比如,为了提高多表级联查询效率,可以合理地使用冗余字段;对于大表,可以使用行的水平切割或者类似Oracle分区表的技术;为了提高数据库查询效率,可以建立有效且合理的索引。

对于数据库软件的优化,根据不同的数据库,如Oracle、MySQL或者SQL Server都拥有不同的方式。以Oracle为例,设置合理大小的共享池、缓存缓冲区或者PGA,对Oracle的运行性能都有很大的影响。

操作系统调优

作为软件运行的基础平台,操作系统的性能对应用系统也有较大的影响。不同类型的操作系统,优化的手段和参数可能会有所不同。比如,在主流UNIX系统中,共享内存段、信号量、共享内存最大值(shmmax)、共享内部才能最小值(shmmin)等都是可以进行优化的系统资源。此外,如最大文件句柄数、虚拟内存大小、磁盘的块大小等参数都可能对软件的性能产生影响。

存在性能问题的系统,十之八九是由某一个系统瓶颈导致的。只要找到该性能瓶颈,分析瓶颈的形成原因,对症下药,使用合理的方法解决性能瓶颈,就能从根本上提升性能。所以,系统性能优化的最主要的就是查找并解决性能瓶颈问题。但同时值得注意的是,性能优化往往会涉及对原来的实现进行较大的修改,因此,很难保证这些修改不会引入新的问题。所以,在性能优化前,需要对性能优化的目标、方法进行统筹的安排。

对软件系统进行优化,首先需要有明确的性能目标,清楚地指出优化的对象和最终目标。其次,需要在目标平台上对软件进行测试,通过各种性能监控和统计工具,观测和确认当前系统是否已经达到相关目标,若已经达到,则没有必要再进行优化;若当前系统性能尚未达到优化目标,则需要查找当前的性能瓶颈。

以上文字整理自:  [Java程序性能优化-.让你的Java程序更快、更稳定].葛一鸣等编著

【转载使用,请注明出处:http://blog.csdn.net/mahoking

时间: 2024-08-05 07:05:20

Java程序性能优化——性能调优层次的相关文章

Java生产环境下性能监控与调优详解

第1章 课程介绍(Java秒杀课程老师倾力打造)本章为大家介绍生产环境可能存在的问题和常用的性能监控工具,以及课程能学到什么,课程内容如何安排等,让大家对课程有个全貌的认识,从而更好的学习这门课程.1-1 为什么学习这门课程? 第2章 基于JDK命令行工具的监控本章带大家学习JDK的命令行监控工具的使用,包括jps.jinfo.jstat.jmap.jstack, 并结合MAT实战如何定位内存溢出,实战如何定位死循环和死锁.2-1 JVM的参数类型2-2 查看JVM运行时参数2-3 jstat查

PHP程序的性能分析与调优基础

1.xdebug xdebug是一个开发源代码的PHP程序调试器(即一个debug工具),可以用来跟踪.调试和分析PHP程序的运行状况. 安装与配置: 1)安装phpize: yum -y install  php-devel 2)安装xdebug: 下载(http://xdebug.org/).解压.上传到linux.执行: cd phpize ./configure  --enable-xdebug make && make install 3)配置: vi  /etc/php.ini

性能分析与调优的原理

最近一直纠结性能分析与调优如何下手,先从硬件开始,还是先从代码或数据库.从操作系统(CPU调度,内存管理,进程调度,磁盘I/O).网络.协议(HTTP, TCP/IP ),还是从应用程序代码,数据库调优,中间件配置等方面入手. 单一个中间件又分web中间件(apache .IIS),应用中间件(tomcat .weblogic .webSphere )等,虽然都是中间件,每一样拎出来往深了学都不是一朝一夕之功.但调优对于每一项的要求又不仅仅是“知道”或“会使用”这么简单.起码要达到“如何更好的使

性能测试分析与性能调优诊断--史上最全的服务器性能分析监控调优篇

一个系统或者网站在功能开发完成后一般最终都需要部署到服务器上运行,那么服务器的性能监控和分析就显得非常重要了,选用什么配置的服务器.如何对服务器进行调优.如何从服务器监控中发现程序的性能问题. 如何判断服务器的瓶颈在哪里等 就成为了服务器性能监控和分析时重点需要去解决的问题了. 1     服务器的性能监控和分析 1.1      Linux服务器的性能指标监控和分析 1.1.1       通过vmstat深挖服务器的性能问题 1.1.2       如何通过mpstat 分析服务器的性能指标

x86服务器中网络性能分析与调优 转

x86服务器中网络性能分析与调优 2017-04-05 巨枫 英特尔精英汇 [OpenStack 易经]是 EasyStack 官微在2017年新推出的技术品牌,将原创技术干货分享给您,本期我们讨论 [x86服务器中网络性能分析与调优] 那些事! >> 网络性能理论极限 网络数据包处理的性能指标,一般包括吞吐.延时.丢包率.抖动等. 数据包有大有小,数据包的大小对这些性能指标有很大的影响. 一般认为服务器处理能力很强,不是数据包处理的瓶颈,而通过物理线路能够传送数据包的最大速率,即线速(Wir

性能测试知多少---性能分析与调优的原理

最近一直纠结性能分析与调优如何下手,先从硬件开始,还是先从代码或数据库.从操作系统(CPU调度,内存管理,进程调度,磁盘I/O).网络.协议(HTTP, TCP/IP ),还是从应用程序代码,数据库调优,中间件配置等方面入手. 单一个中间件又分web中间件(apache .IIS),应用中间件(tomcat .weblogic .webSphere )等,虽然都是中间件,每一样拎出来往深了学都不是一朝一夕之功.但调优对于每一项的要求又不仅仅是"知道"或"会使用"这么

MySQL性能诊断与调优

[MySQL性能诊断与调优] LAMP 系统性能调优,第 3 部分: MySQL 服务器调优 http://www.ibm.com/developerworks/cn/linux/l-tune-lamp-3.html LoadRunner监控MySQL http://www.docin.com/p-92272846.html Advanced MySQL Performance Optimization http://www.mysqlperformanceblog.com/files/pres

java 垃圾回收机制和调优(转)Java Garbage Collection

(转)http://www.cnblogs.com/shudonghe/p/3457990.html 文主要介绍,JVM的组件,自动垃圾收集器是如何工作的,分代垃圾收集器的收集过程,使如何用Visual VM来监视应用的虚拟机,以及JVM中垃圾收集器的种类. 一.JVM架构 1.HotSpot 架构 HotSpot JVM架构支持较强的基本特征和功能,此外还支持高性能和高吞吐率的特性.例如,JVM JIT编译器产生动态优化的代码,亦即,编译器是在Java运行的时候的时候进行优化,并为当然的系统架

Java程序性能优化-调优层次

前言 前篇知道了性能优化相关概念,本篇就继续介绍如何调优.代码优化是我们最常见的,但是除此之外,还有软件架构上.JVM虚拟机层.数据库以及操作系统层面都可以通过各种手段进行调优,从而提升性能. 正题 优化的一般步骤: 如果我们的系统出现了问题,那么最主要的就是要查找并解决性能瓶颈问题,同时性能优化可能对原有的实现进行较大的改动,因此一定要测试打到目标之后才结束. 1.设计调优:设计阶段 一个良好的系统设计可以规避很多潜在的性能问题.因此,尽可能多花些时间在系统设计上,是创建高性能程序的关键. 我