zoukankan      html  css  js  c++  java
  • Java程序性能优化——让你的java程序更快、更稳定

    1、Java性能调优概述

      1.1、Web服务器,响应时间吞吐量是两个重要的性能参数。

      1.2、程序性能的几个表现:

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

      1.3、木桶原理与性能瓶颈

        根据木桶原理,系统的最终性能取决于系统中性能表现最差的组件。

        有可能成为系统瓶颈的计算资源:

          磁盘I/O:

          网络操作:

          CPU:

          异常:

          数据库:

          锁竞争:

          内存:

      1.4、Amdahl定律

        加速比=优化前系统耗时/优化后系统耗时

        设加速比为Speedup,必须串行化的程序比重为F,CPU处理器数量为N,则有:

        

        为了提高系统的速度,仅增加CPU处理器的数量并不一定能起到有效的作用,需要从根本上修改程序的串行行为,提高系统内可并行化的模块比重,在此基础上,合理增加并行处理器数量,才能以最小的投入,得到最大的加速比。

      1.5 性能调优的层次

        设计调优:软件开发之前;所有调优手段的最上层,对软件整体质量有决定性的影响。可以规避某一个组件的性能问题,而非改良该组件的实现。(需要熟悉:常用软件设计方法、设计模式、基本性能组件、常用优化思想)

        代码调优:开发过程中或开发完成后;从微观上对性能的调整,是产生最直接影响的优化方法。熟悉相关的API,对算法、数据结构的灵活使用。

        JVM调优:开发后期;对JVM的运行原理和基本内存结构有一定了解,然后根据程序特点,设置合理的JVM启动参数。

        数据库调优:分为3个部分

          应用层对SQL语句优化:编程技巧,指定列名避免使用*、使用PreparedStatement代替Statement等

          数据库进行优化:冗余字段、水平切割、索引等

          数据库软件进行优化:以Oracle为例,合理的共享池、缓存缓冲区或者PGA等

        操作系统调优:linux,共享内存段、共享内存最大值、最小值、虚拟内存大小、磁盘的块大小等;wiindows,虚拟内存等

      1.6基本调优策略和手段

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

        注意事项:不能为了优化而优化,需要进行慎重的评估。

    2、设计优化

      2.1、设计模式

        2.1.1 单例模式

          频繁使用的对象,可以省略创建对象所花费的时间。

          由于new操作的次数减少,对系统内存的使用频率也会降低,减轻GC压力,缩短GC停顿时间。

          延迟加载、多线程环境(内部类):

    public class StaticSingleton{
       private   StaticSingleton(){
           System.out.println("create");
       }
       private static class SingletonHolder{
           private static StaticSingleton instance = new StaticSingleton();
       }
    
       public static StaticSingleton getInstance(){
           return SingletonHolder.instance;
       }
    }

          反射机制,强行调用单例类的私有构造函数,生成多个单例。

          程序的序列化和反序列化可能会破坏单例。

        2.1.2 代理模式

          原因:安全方面,屏蔽客户端直接访问真实对象;提升系统性能,对真实对象封装,从而达到延迟加载;远程调用中,处理远程方法调用的技术细节。

          动态代理:使用字节码动态生成加载技术,在运行时生成加载类。

           方式:JDK自带的动态代理、CGLIBJavassist或者ASM库。  

        2.1.3 享元模式

          目的:提高系统性能,复用大对象,节省内存空间和对象创建时间

          核心思想:在一个系统中存在多个相同的对象,那么只需共享一份对象的拷贝,而不必为每一次使用都创建新的对象。

          几个概念:享元工厂、抽象享元、具体享元类、Main

          SAAS、租户

          享元模式和对象池:享元对象不可相互替代,对象池中的对象都是等价的。

            

        

        

     

  • 相关阅读:
    Jmeter22:同步定时器-集合点功能
    Jmeter21:固定定时器-死等的方法
    Jmeter20:上传与下载
    Jmeter19:token接口
    Jmeter18:cookie接口-请求提示no cookie的解决方法
    Jmeter17:json提取器-提取数据的方法
    Jmeter16:forEach控制器-针对,在不知道取到得参数有多少?但是要全部执行每一条的情况
    Jmeter15:仅一次控制器-针对在每个并发用户都要调用一次的情况
    Jmeter14:随机顺序执行器-每个请求都执行,当是顺序打乱的情况
    Jmeter13:常用的逻辑控制器-if-随机-仅一次-switch...
  • 原文地址:https://www.cnblogs.com/bookwed/p/6055140.html
Copyright © 2011-2022 走看看