Java性能调优概述

程序性能的主要表现点:

  • 执行速度:程序的反映是否迅速,响应时间是否足够短
  • 内存分配:内存分配是否合理,是否过多地消耗内存或者存在内存泄漏
  • 启动时间:程序从运行到可以正常处理业务需要花费多少时间
  • 负载承受能力:当系统压力上升时,系统的执行速度、响应时间的上升曲线是否平缓

衡量程序性能的主要指标:

  • 执行时间:程序从运行到结束所使用的时间
  • CPU时间:函数或者线程占用CPU的时间
  • 内存分配:程序在运行时占用内容的空间
  • 磁盘吞吐量:描述I/O的使用情况
  • 网络吞吐量:描述网络的使用情况
  • 响应时间:系统对用户行为或者事件做出响应的时间,响应时间越短,性能越好

有可能成为系统性能瓶颈的几个方面:

  • 磁盘I/O:磁盘I/O读写的速度比内容慢很多,如果程序中需要等待磁盘I/O处理,低效的磁盘I/O操作会拖累整个系统
  • 网络操作:由于网络环境的不确定性,导致网络数据读写的操作可能比本地磁盘I/O更慢,如果,网络操作处理不当,也回成为系统瓶颈
  • CPU:对计算资源要求较高的应用,由于长时间、不间断地大量占用CPU资源,那么对CPU的争夺将导致系统性能问题
  • 异常:Java中的异常捕获和处理都是非常消耗资源的,如果代码中高频率的异常处理,那么代码的整体系统能就会明显下降
  • 数据库:大量数据对数据库的读写操作是相当费时的,而往往很多代码中需要等到数据库操作完成之后才可以进行后续操作,这种缓慢的同步操作也将会成为系统瓶颈
  • 锁竞争:对于高并发的系统来讲,锁竞争是相当激烈的,这对性能是一个极大的打击,锁竞争会明显增加线程上下文切换的开销,而往往这些开销都是与应用需求无关的系统开销,白白占用CPU资源,带来不了任何好处
  • 内存:一般情况,只要应用程序设计合理,内存在读写速度上不太可能成为性能瓶颈。除非程序中进行了高频率的内存交换和扫描。内存成为系统瓶颈的最可能的情况就是内存大小不足。如果应用程序中将一些常用的核心数据存入内存,这个一定程度上会降低程序性能,因此,在将常用数据写入内存的时候,要注意一些优化处理

性能调优的层次:

  • 设计调优:处于所有调优手段的上层,在软件开发之前进行,软件设计和架构对软件整体质量有决定性的影响,所以,设计调优对系统性能的影响也是最大的。其他方面的优化都是对系统微观层面上量的优化,而设计优化是对系统在宏观方面上质的优化。一个良好的系统设计可以规避很多潜在的性能问题,因此,尽可能多花时间在系统设计上,是创建高性能程序的关键
  • 代码调优:发生在软件开发的过程中、软件开发完成后、软件维护过程中,对代码进行改进和优化,要求开发员熟悉语言的API、在合适场景使用正确的API、对算法和数据结构灵活运用
  • JVM调优:需要对JVM运行原理和基本内存结构有一定了解,然后依据应用程序的特点,设置合理的JVM启动参数
  • 数据库调优:主要包括在应用层对SQL语句进行优化,对数据库进行优化(设计具有良好表结构的数据库),对数据库软件进行优化(比如使用Oracle数据库,需要设置合理大小的共享池、缓存缓冲区等)
  • 操作系统调优:不同类型的操作系统,调优的手段和参数可能会有所不同。在主流额UNIX系统中,共享内存段、信号量、共享内存最大值、共享内存最小值等都是可以进行优化的系统资源

基本调优策略和手段

  • 明确性能优化的目标,确定优化的对象和最终目的(首先定位到系统的性能瓶颈,确定相关代码进行代码优化,如已无代码优化空间,则要考虑其他方面的优化:JVM优化、数据库层面的优化、操作系统层面的优化等)
  • 对性能优化要进行严格的测试

总结

性能优化有风险和弊端,性能调优必须有明确的目标,不要为了调优而调优!!!盲目调优,风险远大于收益!!!

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持我们!

(0)

相关推荐

  • 浅谈JAVA 异常对于性能的影响

    在对客户做技术支持时,我们常常会看到很多客户根本没意识到的异常.在消除了这些异常之后,代码运行速度与以前相比大幅提升.这让我们产生一种猜测,就是在代码里面使用异常会带来显著的性能开销.因为异常是错误情况处理的重要组成部分,摒弃是不太可能的,所以我们需要衡量异常处理对于性能影响,我们可以通过一个实验看看异常处理的对于性能的影响. 实验 我的实验基于一段随机抛出异常的简单代码.从科学的角度,这并非完全准确的测量,同时我也并不了解HotSpot 编译器会对运行中的代码做何动作.但无论如何,这段代码应该

  • Java并发编程之性能、扩展性和响应

    本文讨论的重点在于多线程应用程序的性能问题.我们会先给性能和扩展性下一个定义,然后再仔细学习一下Amdahl法则.下面的内容我们会考察一下如何用不同的技术方法来减少锁竞争,以及如何用代码来实现. 1.性能 我们都知道,多线程可以用来提高程序的性能,背后的原因在于我们有多核的CPU或多个CPU.每个CPU的内核都可以自己完成任务,因此把一个大的任务分解成一系列的可彼此独立运行的小任务就可以提高程序的整体性能了.可以举个例子,比如有个程序用来将硬盘上某个文件夹下的所有图片的尺寸进行修改,应用多线程技

  • 分享几个提高Java性能的高效用法

    1.在重要的循环里,消除循环终止判断时的方法调用 复制代码 代码如下: for(int i=0; i<collection.size(); i++) { ... } for(int i=0; i<collection.size(); i++) { ... } 替换为- 复制代码 代码如下: view plaincopy to clipboardprint? for(int i=0;n=collection.size();i<n;i++) { ... } 2.通常,把与循环index不相关

  • 使用Java代码获取服务器性能信息及局域网内主机名

    最近做个项目,就是要取得cpu占有率等等的系统信息,一开始以为要用动态链接库了,但后来发现可以像下面这样做,不去调用jni,这样省去了很多看新技术的时间o(∩_∩)o... 在Java中,可以获得总的物理内存.剩余的物理内存.已使用的物理内存等信息,下面例子可以取得这些信息,并且获得在Windows下的内存使用率.      首先编写一个MonitorInfoBean类,用来装载监控的一些信息,包括物理内存.剩余的物理内存.已使用的物理内存.内存使用率等字段,该类的代码如下: package c

  • Java虚拟机JVM性能优化(三):垃圾收集详解

    Java平台的垃圾收集机制显著提高了开发者的效率,但是一个实现糟糕的垃圾收集器可能过多地消耗应用程序的资源.在Java虚拟机性能优化系列的第三部分,Eva Andreasson向Java初学者介绍了Java平台的内存模型和垃圾收集机制.她解释了为什么碎片化(而不是垃圾收集)是Java应用程序性能的主要问题所在,以及为什么分代垃圾收集和压缩是目前处理Java应用程序碎片化的主要办法(但不是最有新意的). 垃圾收集(GC)的目的是释放那些不再被任何活动对象引用的Java对象所占用的内存,它是Java

  • java开发中如何使用JVisualVM进行性能分析

    JVisualVM是由Sun提供的性能分析工具,如此强大的后盾怎能不强大?在Jdk6.0以后的版本中是自带的,配置好环境变量然后在运行中输入"JVisualVm"或直接到Jdk的安装目录的Bin目录下找到运行程序即可运行.如果是用Jdk1.5或以前版本的朋友就得要单独安装了. 我觉得其还有一个强大的地方就是不需要用代理启动(即如果要监视某个程序则需要用测试软件来运行程序方便其监视如YourKit这款同类的测试工具)的方式来运行,十分方便,只要是用Jdk环境运行的,打开此测试工具后即能看

  • Java遍历集合方法分析(实现原理、算法性能、适用场合)

    概述 Java语言中,提供了一套数据集合框架,其中定义了一些诸如List.Set等抽象数据类型,每个抽象数据类型的各个具体实现,底层又采用了不同的实现方式,比如ArrayList和LinkedList. 除此之外,Java对于数据集合的遍历,也提供了几种不同的方式.开发人员必须要清楚的明白每一种遍历方式的特点.适用场合.以及在不同底层实现上的表现.下面就详细分析一下这一块内容. 数据元素是怎样在内存中存放的? 数据元素在内存中,主要有2种存储方式: 1.顺序存储,Random Access(Di

  • java字符串拼接与性能分析详解

    假设有一个字符串,我们将对这个字符串做大量循环拼接操作,使用"+"的话将得到最低的性能.但是究竟这个性能有多差?如果我们同时也把StringBuffer,StringBuilder或String.concat()放入性能测试中,结果又会如何呢?本文将会就这些问题给出一个答案! 我们将使用Per4j来计算性能,因为这个工具可以给我们一个完整的性能指标集合,比如最小,最大耗时,统计时间段的标准偏差等.在测试代码中,为了得到一个准确的标准偏差值,我们将执行20个拼接"*"

  • Java中Map的遍历方法及性能测试

    1. 阐述 对于Java中Map的遍历方式,很多文章都推荐使用entrySet,认为其比keySet的效率高很多.理由是:entrySet方法一次拿到所有key和value的集合:而keySet拿到的只是key的集合,针对每个key,都要去Map中额外查找一次value,从而降低了总体效率.那么实际情况如何呢? 为了解遍历性能的真实差距,包括在遍历key+value.遍历key.遍历value等不同场景下的差异,我试着进行了一些对比测试. 2. 对比测试 一开始只进行了简单的测试,但结果却表明k

  • Java虚拟机JVM性能优化(一):JVM知识总结

    Java应用程序是运行在JVM上的,但是你对JVM技术了解吗?这篇文章(这个系列的第一部分)讲述了经典Java虚拟机是怎么样工作的,例如:Java一次编写的利弊,跨平台引擎,垃圾回收基础知识,经典的GC算法和编译优化.之后的文章会讲JVM性能优化,包括最新的JVM设计--支持当今高并发Java应用的性能和扩展. 如果你是一个开发人员,你肯定遇到过这样的特殊感觉,你突然灵光一现,所有的思路连接起来了,你能以一个新的视角来回想起你以前的想法.我个人很喜欢学习新知识带来的这种感觉.我已经有过很多次这样

  • JAVA LinkedList和ArrayList的使用及性能分析

    第1部分 List概括List的框架图List 是一个接口,它继承于Collection的接口.它代表着有序的队列.AbstractList 是一个抽象类,它继承于AbstractCollection.AbstractList实现List接口中除size().get(int location)之外的函数.AbstractSequentialList 是一个抽象类,它继承于AbstractList.AbstractSequentialList 实现了"链表中,根据index索引值操作链表的全部函数

随机推荐