全网最全性能优化总结!!(冰河吐血整理,建议收藏)

冰河 冰河     2023-01-15     408

关键词:

大家好,我是冰河~~

随着互联网的高速发展,互联网行业已经从IT时代慢慢步入到DT时代。对于Java程序员的要求越来越高,只是单纯的掌握CRUD以不足以胜任互联网公司的相关职位,大量招聘岗位显示:如果是面试中高级的Java岗,基本上都需要懂性能优化的相关知识。今天,我们就一起来聊聊如何进行性能优化这个话题。

小伙伴们如果觉得文章不错,点赞、收藏、评论,分享走一起呀,记得给冰河来个一键三连~~

好了,我们开始今天的正文。

性能优化有哪些方面?

这里,我结合平时工作中的总结,将性能优化总结为下面这张图。

也就是说,我们可以从数据聚合优化、资源冲突优化、算法优化、JVM优化、复用优化、计算优化和快速实现等方面来进行回答。接下来,我们就针对每个点进行说明。

数据聚合优化

数据聚合优化主要针对的是对于数据的整合和传输的优化。比如:我们从数据库中查询出的数据,经过程序的聚合处理后再返回给客户端,而不用客户端调用多次接口来分别获取数据。

再比如:我们在项目中使用的Nginx,一般都会开启GZIP压缩,使传输的数据更加紧凑,同时,使传输的数据量更小。

细心的小伙伴会发现,我们对于数据聚合的优化,主要是使传输的数据量更小。所以,我们在使用SQL语句查询数据库中的数据时,尽量查询那些需要的字段,对于不需要的字段就直接忽略不查询了,避免在SQL语句中出现select *

资源冲突优化

在我们平时的工作中,尤其是在高并发的场景下,经常会出现锁冲突的问题,锁冲突是资源冲突的一个典型场景。

关于锁我们可以联想到数据库的行锁、表锁、Java中的synchronized和Lock等。如果对应到操作系统级别,则会有CPU命令级别的锁,JVM指令级别的锁,操作系统的内部锁等。

这里,小伙伴们需要注意一点:只有在并发的场景下,才会出现资源冲突的问题。也就是说:在同一时刻,只能有一个请求获取到请求资源,解决冲突的方式就是加锁。

我们需要在平时的工作过程中避免锁冲突的问题,优化如何优化加锁方式,小伙伴们可以参见《【高并发】面试官:讲讲高并发场景下如何优化加锁方式?》一文。

算法优化

在一个大型的互联网项目中,往往涉及到分布式和微服务等技术,其中,也会使用到大量的数据结构和算法,对于算法的优化能够显著的提高系统的性能。一个好的实现,相比于一个拙劣的实现来说,在系统性能的提升上存在着巨大的差异。

比如,作为 List 的实现,LinkedList 和 ArrayList 在随机访问的性能上,差了好几个数量级;又比如,CopyOnWriteList 采用写时复制的方式,可以显著降低读多写少场景下的锁冲突。而什么时候使用同步,什么时候是线程安全的,也对我们的编码能力有较高的要求。

所以,我们需要在平时工作过程中,多多积累数据结构和算法的相关知识。

JVM优化

JVM调优,不用说,这是每个Java工程师必须要掌握的标准技能。所有的Java程序最终都是运行在JVM中的,对JVM进行优化也能够提升Java程序的性能。但是,需要注意的是:如果在优化JVM时,参数设置不当,可能会造成内存溢出等严重的问题。

目前被广泛使用的垃圾回收器是 G1,通过很少的参数配置,内存即可高效回收。CMS 垃圾回收器已经在 Java 14 中被移除,由于它的 GC 时间不可控,有条件应该尽量避免使用。

复用优化

复用优化,这个看名字就知道,说白了就是可以重复利用。估计很多小伙伴都有这样的经验,在写代码的时候,可以将很多重复的代码抽象出来,做成公共的方法。这样,就不用每次都去写重复的逻辑代码了。这是代码层面的复用。

如果是数据层面的话,我们可以使用缓冲和缓存来复用数据。

这里,小伙伴们需要注意一个知识点:缓冲主要针对的是写操作,缓存主要针对的是读操作。

另一个复用优化的典型场景就是池化技术,比如:数据库连接池、线程池等。

计算优化

对于计算优化来说,我们可以从以下几个小的方面来阐述。

并行计算

不难理解,就是多个计算同时进行。这里,又可以将并行计算分为:多机并行计算、多进程并行计算和多线程并行计算。

多机并行计算: 将一个大的计算任务,拆分成N个小的计算任务,分发到不同的机器进行处理。典型的场景就是Hadoop的MapReduce极端。

多进程计算: 比如,Nginx采用的NIO模型,采用的是进程调度的策略,由Master进程调度Worker进程,Worker进行来处理具体的请求。

多线程计算: 对于多线程计算来说,也是我们平时接触最多的一种计算方式,我们可以使用多线程技术,将复杂的逻辑计算拆分成一个个小的计算任务,分发到不同的线程中去执行。

同步变异步

同步和异步的区别就是:同步需要等待返回结果,异步不需要等待返回结果。如果我们在业务程序中,不需要等待返回结果数据,则我们可以将同步调用优化为异步调用,从而提升我们系统的性能。

懒加载

最典型的场景就是Spring中的懒加载,只有第一次获取bean的时候,才会创建bean实例。

快速实现

对于快速实现来说,不仅包含我们需要利用相关的程序框架迅速开发出我们想要的业务,也需要我们在进行技术选型时,尽量使用一些性能优良的组件。比如,在进行网络开发时,尽量选择Netty,结合轻量级的数据传输,就不要使用WebService等技术了。

很多公司喜欢使用适配器模式,在一些现有的开源组件之上,再抽象一层自己的组件,这样就能够做到切换底层组件的时候,对上层应用无感。

写在最后

如果你想进大厂,想升职加薪,或者对自己现有的工作比较迷茫,都可以私信我交流,希望我的一些经历能够帮助到大家~~

推荐阅读:

好了,今天就到这儿吧,小伙伴们点赞、收藏、评论,一键三连走起呀,我是冰河,我们下期见~~

全网最全linux命令总结!!(史上最全,建议收藏)(代码片段)

大家好,我是冰河~~最近家里的事情太多了,很久没更新技术文了。期间,也收到了很多小伙伴的鼓励,谢谢大家的帮助和支持,我想感谢大家最好的方式就是持续分享好的技术文章了吧,让自己和他人持... 查看详情

全网最全linux命令总结!!(史上最全,建议收藏)(代码片段)

大家好,我是冰河~~最近家里的事情太多了,很久没更新技术文了。期间,也收到了很多小伙伴的鼓励,谢谢大家的帮助和支持,我想感谢大家最好的方式就是持续分享好的技术文章了吧,让自己和他人持... 查看详情

2023最新整理!全网最全python标准库总结(学习宝典,建议收藏)(代码片段)

标准库Python拥有一个强大的标准库。Python语言的核心只包含数字、字符串、列表、字典、文件等常见类型和函数,而由Python标准库提供了系统管理、网络通信、文本处理、数据库接口、图形系统、XML处理等额外的功能。Python... 查看详情

建议收藏ヾ(^▽^*)))全网最全输入输出格式符整理(代码片段)

输入输出格式符前言数据输入语句一、scanf函数格式字符串1)类型2)“*”符3)宽度4)长度二、getchar函数数据输出语句一、printf函数调用的一般形式二、格式字符串三、字符输出函数(putchar)总结前言大... 查看详情

耗时一周深入理解jvm虚拟机异常处理字节码性能优化,全网最全面的jvm原理通俗易懂(强烈建议收藏)(代码片段)

深入JVM精益、平均的JVM虚拟机什么是Java虚拟机?为什么会在这里?Java字节码虚拟零件骄傲的,少数的,登记册方法区和程序计数器Java堆栈和相关寄存器垃圾收集堆永恒的数学:JVM模拟Java虚拟机如何处理异常... 查看详情

全网最全正则表达式总结(全新升级版),让你的工作效率事半功倍,赶快收藏,让代码写起来快的嗖嗖的~~(代码片段)

大家好,我是冰河~~我用了两天时间整理了这些工作用常用的正则表达式,小伙伴们拿走,不谢~这次我把工作中总结的经常使用的正则表达式共享出来了,正是掌握了这些正则表达式,冰河平均每天比别... 查看详情

全网最全正则表达式总结(全新升级版),让你的工作效率事半功倍,赶快收藏,让代码写起来快的嗖嗖的~~(代码片段)

大家好,我是冰河~~我用了两天时间整理了这些工作用常用的正则表达式,小伙伴们拿走,不谢~这次我把工作中总结的经常使用的正则表达式共享出来了,正是掌握了这些正则表达式,冰河平均每天比别... 查看详情

2021年全网最全java面试总结及答案建议收藏(代码片段)

下面是本次总结包含Java内容:多线程,并发及线程基础数据类型转换的基本原则垃圾回收(GC)Java集合框架数组字符串GOF设计模式SOLID(单一功能、开闭原则、里氏替换、接口隔离以及依赖反转)设计原则... 查看详情

肝帝一周总结:全网最全最细☀️mysql索引数据结构详解与索引优化☀️《❤️记得收藏❤️》(代码片段)

【肝帝一周总结:全网最全最细】☀️Mysql索引数据结构详解与索引优化☀️《❤️记得收藏❤️》目录🏳️‍🌈开讲啦!!!!🏳️‍🌈🏳️‍🌈1、索引🚣2、索引数据结构... 查看详情

史上最全wireshark使用教程,8万字整理总结,建议先收藏再耐心研读

 目录第 1 章 介绍...11.1. 什么是Wireshark.11.1.1. 主要应用...11.1.2. 特性...11.1.3. 捕捉多种网络接口...21.1.4. 支持多种其它程序捕捉的文件...21.1.5. 支持多格式输出...21.1.6. 对多种协议解码提供支持...21.1.7. 开源软件...21.1.8. Wire... 查看详情

史上最全wireshark使用教程,8万字整理总结,建议先收藏再耐心研读

 目录第 1 章 介绍...11.1. 什么是Wireshark.11.1.1. 主要应用...11.1.2. 特性...11.1.3. 捕捉多种网络接口...21.1.4. 支持多种其它程序捕捉的文件...21.1.5. 支持多格式输出...21.1.6. 对多种协议解码提供支持...21.1.7. 开源软件...21.1.8. Wire... 查看详情

全网最全html标签详解大全-第一篇建议收藏(代码片段)

前文导读:前端学习路线Html代码都是由标签组成的,标签就是最基础的东西,所以我们要重点学习这些标签。本人爆肝整理了几乎所有常用的标签详解,期待各位的关注与支持。废话少说直接进入重点。基本结构... 查看详情

❤️《画解数据结构》全网最全栈总结,九个动画组图轮播,不懂都难❤️(建议收藏)(代码片段)

零、前言  「数据结构」和「算法」是密不可分的,两者往往是「相辅相成」的存在,所以,在学习「数据结构」的过程中,不免会遇到各种「算法」。  到底是先学数据结构,还是先学算法,我认为... 查看详情

❤️《画解数据结构》全网最全栈总结,九个动画组图轮播,不懂都难❤️(建议收藏)(代码片段)

本文已收录于专栏🌳《画解数据结构》🌳零、前言  「数据结构」和「算法」是密不可分的,两者往往是「相辅相成」的存在,所以,在学习「数据结构」的过程中,不免会遇到各种「算法」。  到... 查看详情

go语言最全优化技巧总结,值得收藏!

导语 | 本文总结了在维护go基础库过程中,用到或者见到的一些性能优化技巧,现将一些理解梳理撰写成文,和大家探讨。一、常规手段(一)sync.Pool临时对象池应该是对可读性影响最小且优化效果显著的手... 查看详情

硬核!全网最全nginx配置指令,建议收藏~(代码片段)

硬核!全网最全Nginx配置指令,建议收藏~1、前言1.1、Nginx配置文件各个主配置块说明1.2、Nginx配置符号参考1.3、本文出现的一些词汇介绍2、正文2.1、位于全局块的配置指令2.2、位于events块的配置指令2.3、位于http块的配置... 查看详情

硬核!全网最全nginx配置指令,建议收藏~(代码片段)

硬核!全网最全Nginx配置指令,建议收藏~1、前言1.1、Nginx配置文件各个主配置块说明1.2、Nginx配置符号参考1.3、本文出现的一些词汇介绍2、正文2.1、位于全局块的配置指令2.2、位于events块的配置指令2.3、位于http块的配置... 查看详情

万字长文,整理到吐血!linux最全命令总结

关注我,每天分享软件测试技术干货、面试经验,想要领取测试资料、进入软件测试学习交流群的可以直接加群644956177~~这篇文章主要向大家介绍Linux命令本身总结,主要内容包括基础应用、实用技巧、原理机制等方面࿰... 查看详情