一、性能测试


Ⅰ.测试方法

  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服务

五、总结


写在最后

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

  1. 阿里P7架构师详解微服务链路追踪原理

    背景介绍 在微服务横行的时代,服务化思维逐渐成为了程序员的基本思维模式,但是,由于绝大部分项目只是一味地增加服务,并没有对其妥善管理,当接口出现问题时,很难从错综复杂的服务调用网络中找到问题根源,从而 ...

  2. Java开发不懂Docker,学尽Java也枉然,阿里P8架构师手把手带你玩转Docker实战

    转: Java开发不懂Docker,学尽Java也枉然,阿里P8架构师手把手带你玩转Docker实战 Docker简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一 ...

  3. 阿里P8架构师深度概述分布式架构

    简介 作为一名架构师,我们要专业,要能看懂代码,及时光着臂膀去机房,也能独挡一面!及时同事搞不定问题,或者撂挑子,你也能给老大一个坚定的眼神:不怕,有我在!还能在会议室上滔滔不绝,如若无人,让不懂技术 ...

  4. 阿里P8架构师谈:MySQL慢查询优化、索引优化、以及表等优化总结

    更多内容:https://www.toutiao.com/i6599796228886626829/?tt_from=weixin&utm_campaign=client_share& ...

  5. 阿里P8架构师谈:数据库分库分表、读写分离的原理实现,使用场景

    本文转载自:阿里P8架构师谈:数据库分库分表.读写分离的原理实现,使用场景 为什么要分库分表和读写分离? 类似淘宝网这样的网站,海量数据的存储和访问成为了系统设计的瓶颈问题,日益增长的业务数据,无疑对 ...

  6. 阿里P8架构师讲述:3—5年程序员的发展和出路在哪里?

    工作3—5年后,程序员们的成长将迈入一个全新阶段.这既是程序员们的黄金时期同时又是最迷茫的时期,因为大家必须要要思考一下今后的职业方向. 3—5年程序员的发展和出路在哪里? 是继续做技术人,还是向管理 ...

  7. 资深P7架构师详解淘宝服务端高并发分布式架构演进之路

    1. 概述 本文以淘宝作为例子,介绍从一百个并发到千万级并发情况下服务端的架构的演进过程,同时列举出每个演进阶段会遇到的相关技术,让大家对架构的演进有一个整体的认知,文章最后汇总了一些架构设计的原则. ...

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

    JVM内存调优 对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数. 1.Full GC 会对整个堆进行整理,包括Young.Tenured和Perm.Full GC因为需要对 ...

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

    一.什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速.比如,如果一个线程完成一 ...

随机推荐

  1. _deque实现

    /* deque是一种双向开口的连续线性空间,可以在头尾两端分别做元素的插入和删除操作 常用接口:back(), front(), push_back(), pop_back(), push_fron ...

  2. 你不知道的JavaScript--Item34 大白话解说Promise

    去年6月份. ES2015正式公布(也就是ES6.ES6是它的乳名),当中Promise被列为正式规范.作为ES6中最重要的特性之中的一个,我们有必要掌握并理解透彻.本文将由浅到深,解说Promise ...

  3. 金典 SQL笔记(6)

    page223-索引 --利用SQL 语句创建索引 --CREATE INDEX 索引名称on 表名(字段 ,字段, 字段字段n) --索引名称必须为唯一的,字段 ,字段, 同意一个到多个 --范例为 ...

  4. 通达OA 小飞鱼老师OA工作流设计课程教学网络公开课之HTML基础(一)

    通达OA网络教学公开课開始了.有须要的小伙伴们抓住机会奥. 8月29号晚8点不见不散.本次课程的主要内容是通达OA工作流设计课程中须要用到的Html部分学习. 帮忙转发的朋友加送一节VIP课程.

  5. YTU 2732:3798-Abs Problem

    2732: 3798-Abs Problem 时间限制: 1 Sec  内存限制: 128 MB  Special Judge 提交: 167  解决: 60 题目描述 Alice and Bob i ...

  6. 【POJ 3974】 Palindrome

    [题目链接] http://poj.org/problem?id=3974 [算法] 解法1 : 字符串哈希 我们可以分别考虑奇回文子串和偶回文子串,从前往后扫描字符串,然后二分答案,检验可以用哈希 ...

  7. 【POJ 3714】 Raid

    [题目链接] http://poj.org/problem?id=3714 [算法] 分治求平面最近点对 [代码] #include <algorithm> #include <bi ...

  8. java将JSON字符串转换为实体类对象,基于net.sf.json实现

    @SuppressWarnings("unchecked") public static <T> T jsonToObject(String jsonString, C ...

  9. Android -----listView的重要属性

    android:transcriptMode="alwaysScroll" android:cacheColorHint="#00000000" android ...

  10. 大数据~说说ZooKeeper

    一些概念 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase和Kafka重要组件.它是一个为分布式应用提供一致性 ...