阿里P8架构师详解Java性能调优策略

一、性能测试


Ⅰ.测试方法

  1. 微基准性能测试
  • 可以精准定位到某个模块或者某个方法的性能问题,例如对比一个方法使用同步实现和非同步实现的性能差异
  1. 宏基准性能测试
  • 宏基准性能测试是一个综合测试,需要考虑到测试环境、测试场景和测试目标
  • 测试环境:模拟线上的真实环境
  • 测试场景:在测试某个接口时,是否有其他业务的接口也在平行运行,进而造成干扰
  • 测试目标
    • 可以通过吞吐量和响应时间来衡量系统是否达标,如果不达标,就需要进行优化
    • 如果达标,就继续加大测试的并发数,探底接口的TPS
    • 除了关注接口的吞吐量和响应时间外,还需要关注CPU、内存和IO的使用率情况

Ⅱ.干扰因素

1.热身问题

①. 在Java编程语言和环境中,.java文件编译成.class文件后,需要通过解析器将字节码转换成本地机器码才能运行

②. 为了节约内存和执行效率,代码在最初被执行时,解析器会率先解析执行这段代码

③. 随着代码被执行的次数增加,当JVM发现某个方法或代码块运行得很频繁时,就会把这些代码认定为热点代码

  • 为了提高热点代码的执行效率,在运行时,JVM将通过即时编译器(JIT)把这些代码编译成与本地平台相关的机器码
  • 并进行各层次的优化,然后存储在内存中,之后每次运行代码时,直接从内存中获取

④. 因此在刚开始运行的阶段,JVM会花费很长的时间来全面优化代码,后面就能以最高性能运行了

2. 测试结果不稳定

①. 不稳定因素:机器其他进程的影响、网络波动、JVM GC的不确定性
①. 解决方案:通过多次测试,将测试结果求平均,只要能保证平均值在一个合理的范围之内,并且波动不大即可

3. 多JVM

①. 任意一个JVM都拥有整个系统的资源使用权
②. 如果一台机器上只部署单独的一个JVM,在做性能测试时,测试结果会很好,但一台机器上有多个JVM,则不一定
③. 尽量避免线程环境一台机器部署多个JVM

二、性能分析



1.完成性能测试之后,需要输出一份性能测试报告,测试结果需要包括

  • 测试接口的吞吐量和响应时间(平均、最大、最小)
  • 服务器的CPU、内存、磁盘IO、网络IO使用率、JVM的GC情况

2.通过观察性能指标,可以发现性能瓶颈,再通过自下而上的方式分析查找问题

  • 首先从操作系统层面,查看系统的CPU、内存、磁盘IO、网络IO的使用率是否存在异常
  • 再通过命令查找异常日志,通过分析日志,寻找导致性能瓶颈的原因
  • 还可以从Java应用的JVM层面下手,查看JVM的GC频率以及内存分配情况是否存在异常
  • 如果系统和JVM层面都没有出现异常情况,可以查看应用服务业务层是否存在性能瓶颈
    • 例如Java编程的问题、读写数据瓶颈

3.分析查找性能问题可以采用自下而上的方式,而解决性能问题,一般采用自上而下的方式逐级优化

三、性能调优



思路:业务调优 -> 编程调优 -> 系统调优

Ⅰ. 优化代码

1.应用层的问题代码往往会因为耗尽系统资源而暴露出来

2.例如某段代码导致内存溢出,这往往是将JVM的内存耗尽了

  • 这会引发JVM频繁地发生GC,导致CPU居高不下,此时也会耗尽系统的CPU资源

3.还有一些非问题代码导致的性能问题,比较难以发现

  • 例如如果对LinkedList进行for循环遍历,每次循环获取元素时,都会遍历一次list,读效率很低
  • 优化方案:可以采用Iterator

Ⅱ. 优化设计

1.面向对象有很多设计模式,可以用于优化业务层以及中间件层的代码设计,进而达到精简代码和提高整体性能的目的

2.例如单例模式在频繁创建对象的场景中,可以共享一个对象,减少频繁创建和销毁对象带来的性能开销

Ⅲ. 优化算法

1.合适的算法可以大大提升系统性能

2.例如在不同的场景中,使用合适的查找算法可以降低时间复杂度

Ⅳ. 时间换空间

1.如果系统对查询的速度没有很高的要求,但对存储空间要求苛刻,可以考虑用时间换空间

2.例如String的intern方法,可以将重复率比较高的数据存储在常量池,重复使用相同的对象,大大节省内存空间

  • 但由于常量池使用的是HashMap类型,如果存储数据过多,就会导致查询性能下降

Ⅴ. 空间换时间

1.使用存储空间来提升访问速度
2.例如MySQL的分库分表

Ⅵ. 参数调优

1.根据业务场景,合理地设置JVM的内存空间和GC算法
2.另外,合理地设置Web容器的线程池大小和Linux操作系统的内核参数

四、兜底策略



1.性能优化策略,主要为了提高系统性能,而兜底策略,主要为了确保系统的稳定性

2.限流

  • 对系统的入口设置最大访问限制,参考性能测试中探底的接口TPS
  • 同时采用熔断措施,友好地返回没有成功的请求

3.智能横向扩容

  • 当访问量超过某一个阈值时,系统可以根据需求自动横向扩容

4.提前扩容

  • 常用于高并发系统,例如瞬时抢购
  • 此时智能横向扩容无法满足大量发生在瞬间的请求

5.Kubernetes可以实现智能横向扩容和提前扩容Docker服务

五、总结



写在最后

原文地址:https://www.cnblogs.com/Java-no-1/p/11079373.html

时间: 2024-10-07 13:05:29

阿里P8架构师详解Java性能调优策略的相关文章

阿里P8架构师谈:2019的Java程序员要怎么提升?拿30K高薪?

最近去阿里的菜鸟国际做了一次面试交流,发现大公 阿里P8架构师谈:2019的Java程序员要怎么提升?拿30K高薪?司对于面试者的知识结构考核非常严谨,可以作为我们日常工作学习的指导.虽然很多人说面试问到的东西在实际工作中很少用到,甚至有「面试造火箭,工作拧螺丝」的说法.但从面试中,其实可以看得出来现在的公司对于面试者的知识体系要求.如果我们能在工作中就按着这样的要求去不断提升,那么在面试的时候必然也能游刃有余. 具有一到五年开发经验的程序员 需要学习的内容? 技术学到这个阶段,很容易遇到瓶颈,

阿里P8架构师谈:消息中间件介绍、典型使用场景、以及使用原则

阿里P8架构师谈:消息中间件介绍.典型使用场景.以及使用原则大型分布式架构里一定会涉及到消息中间件,今天先谈谈消息中间件. 本文作者 陈睿 优知学院创始人 曾任职阿里巴巴高级软件工程师.百度研发经理.携程定制旅游CTO 常用的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ. 一.kafka1.不完全符合jms规范,注重吞吐量,类似udp 和 tcp 2.一般做大数据吞吐的管道 我们现在的用途就是负责在各个idc之间通信 3.量大对数据不是百

阿里P7架构师告诉你Java架构师必须知道的 6 大设计原则

在软件开发中,前人对软件系统的设计和开发总结了一些原则和模式, 不管用什么语言做开发,都将对我们系统设计和开发提供指导意义.本文主要将总结这些常见的原则,和具体阐述意义. 开发原则 面向对象的基本原则(solid)是五个,但是在经常被提到的除了这五个之外还有 迪米特法则和合成复用原则等, 所以在常见的文章中有表示写六大或七大原则的: 除此之外我还将给出一些其它相关书籍和互联网上出现的原则: S单一职责SRP Single-Responsibility Principle, 一个类,最好只做一件事

Java架构师面试题——JVM性能调优

JVM内存调优 对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数. 1.Full GC 会对整个堆进行整理,包括Young.Tenured和Perm.Full GC因为需要对整个堆进行回收,所以比较慢,因此应该尽可能减少Full GC的次数. 2.导致Full GC的原因 1)年老代(Tenured)被写满 调优时尽量让对象在新生代GC时被回收.让对象在新生代多存活一段时间和不要创建过大的对象及数组避免直接在旧生代创建对象 . 2)持久代Pemanet Generati

阿里P8架构师总结Java并发面试题(精选)

一.什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速.比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒. 二.线程和进程有什么区别? 线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务.不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间.每个线程都拥有单独的栈内存用来存储本地数据. 三.如何在Java中实现线程?

前阿里P8架构师总结的一些关于Java多线程的编程经验丨干货

一.认识多任务.多进程.单线程.多线程 要认识多线程就要从操作系统的原理说起. 以前古老的DOS操作系统(V 6.22)是单任务的,还没有线程的概念,系统在每次只能做一件事情.比如你在copy东西的时候不能rename文件名.为了提高系统的利用效率,采用批处理来批量执行任务. 现在的操作系统都是多任务操作系统,每个运行的任务就是操作系统所做的一件事情,比如你在听歌的同时还在用MSN和好友聊天.听歌和聊天就是两个任务,这个两个任务是“同时”进行的.一个任务一般对应一个进程,也可能包含好几个进程.比

阿里P8架构师告诉你什么是分布式架构

一.前言 我们都知道,当今无论在BAT这样的大公司,还是各种各样的小公司,甚至是传统行业刚转互联网的企业都开始使用分布式架构,那么什么叫分布式架构呢?分布式架构有什么好处呢?分布式架构经过了怎样的发展呢?是哪家企业开启了分布式架构的时代呢?读完本文,你就会得到这些答案,下面让我们一起来开启分布式概述的奇妙之旅吧! 二.分布式架构的发展历史 1946年2.14日,那是一个浪漫的情人节 , 世界上第一台电子数字计算机在美国宾夕法尼亚大学诞生了,她的名字叫ENIAC.这台计算机占地170平米.重达 3

前阿里P8架构师谈如何设计优秀的API

随着大数据.公共平台等互联网技术的日益成熟,API接口的重要性日益凸显,从公司的角度来看,API可以算作是公司一笔巨大的资产,公共API可以捕获用户.为公司做出许多贡献.对于个人来说,只要你编程,你就是一个API设计者,因为好的代码即是模块--每个模块便是一个API,而好的模块会被多次使用.此外,编写API还有利于开发者提高代码质量,提高自身的编码水平. 优秀API所具备的特征: 简单易学: 易于使用,即使没有文档: 很难误用: 易于阅读,代码易于维护: 足够强大,可以满足需求: 易于扩展: 适

15年资深架构师详解:一个大型互联网公司的微服务转型实践

微服务是一个比较大的话题,基于我的过往经历,本文将以 Netflix 为例,分享一个大型互联网公司如何从一个 Monolithic 的 APP 成功转型到微服务.文章主要涉及微服务的产生历史,应用场景,与单片服务区别,微服务带来的技术.企业组织结构等方面挑战,以及如何合理地选择单片服务构架和微服务构架等内容. 微服务的产生历史 如下图,是微服务在 Google 的搜索结果: 自 2014 年以来,微服务开始被关注,搜索的人越来越多,并在 2016 年左右达到顶峰.从地域来看,很多国家都在关注,如