当前位置: 首页 > 后端技术 > Java

Java性能优化

时间:2023-04-01 21:12:33 Java

性能调优分层设计调优代码调优JVM调优数据库调优操作系统调优设计调优设计模式的好用生成一个对象的具体实例,保证系统中只生成一个类的实例。好处;1>对于经常使用的对象,创建对象所花费的时间可以省略,对于那些重量级对象来说是相当大的系统开销2>保证一个类中只有一个对象,并且每次调用都是针对同一个对象,减少新操作的数量,降低系统内存使用频率,减轻GC压力,缩短GC停顿时间。代理模式使用代理模式将消耗资源最多的方法分离出来,可以加快系统启动速度,减少用户等待时间。核心其实就是使用懒加载,只有在当前组件被使用的时候,才会进行初始化。这样,如果一些组件不用,就不需要加载,避免了资源的浪费享元模式如果一个系统中有多个相同的对象,那么只需要共享对象的一个??副本,而不需要创建每次使用一个新的对象,好处:1>享元模式维护的同一个对象,每次只会创建一次。当创建的对象比较耗时时,可以节省很多时间。压力也对应减少应用:String类对象,String类在Java中被定义为final(不可更改),JVM中的字符串一般存储在字符串常量池中,java会保证常量池中只有一个字符串Copy,这个字符串常量池在JDK6.0之前是位于常量池中,位于永久代中,但是在JDK7.0中,JVM将其从永久代中取出,放到了堆中。观察者模式当一个对象的行为取决于另一个对象的状态时,观察者模式就相当有用了。如果不使用观察者模式,就只能在另一个线程中不断的监视对象所依赖的状态。实现这个功能可能需要开很多线程常用的优化组件和方法1.buffer缓冲区可以是一个特定的区域,主要解决应用上下层的性能差异,提高应用的性能系统。使用场景特点:1>数据通信不需要太实时,异步通信应用:消息队列MQ,削峰填谷。在日志系统silfj中,如果数据太大,会先写入队列,再慢慢写入日志服务器。2、缓存功能:开辟一块内存空间,存放数据处理结果,以供下次访问。应用:Redis等缓存软件功能3.对象重用(池化)如果一个类被频繁请求使用,没必要每次都生成一个实例,但是可以将这个类的一些实例保存在一个池中,以备下次使用需要从池中获取它,并在完成后将其放回池中。应用:线程池和数据库连接池都采用这种方式4.以并行代替串行结合CPU的多核并行能力,实现多线程,最大限度发挥CPU的潜力5.负载均衡应用:分布式clusterJava程序优化助力提升性能Tips1.谨慎使用exceptiontry-catch:每个class文件后面都会跟着一个异常表,每次try-catch都会往这个表中添加行记录,每条记录有4条信息(开始trycatch行(begin_pc)、结束行(begin_pc)、异常处理起始行(handler_pc、catch代码块)、异常类型catch_type)1>当代码出现异常时,会去异常表中查找thrownexception是否在begin_pc和begin_end之间,如果是,且是catch_type类型,则跳转到handler_pc的位置执行。停止方法的出栈入栈操作,追溯整个链路的栈信息2>如果代码没有异常,就不会去表中查找,基本不会有性能表现消费建议:需要try-catch的地方需要继续使用。避免在for循环中使用2,使用局部变量调用方法时传递参数,调用时创建的临时变量全部存储在栈(Stack)中,速度更快。其他的变量,静态变量,实例变量等,都是在堆(Heap)中创建的,比较慢3.位运算代替乘除法。在所有操作中,位操作是最高效的a*=2==>a<<=1a/=2==>a>>=14。尽量提取表达式,避免冗余计算x=dab/34a;y=eab/34a;可以优化为t=ab/34*a;x=d*t;y=e*t;5.静态方法代替实例方法java中的实例方法需要维护一个类似虚函数表的结构来支持多态。与静态方法相比,实例方法的调用需要更多的资源(比如继承自父类,在实例化对象时可能需要执行父类的构造函数)