大家好,我是冰河~~

随着互联网的高速发展,互联网行业已经从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等技术了。

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

写在最后

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

推荐阅读:

  • 《三天撸完了MyBatis,各位随便问!!(冰河吐血整理,建议收藏)》
  • 《奉劝那些刚参加工作的学弟学妹们:要想进大厂,这些核心技能是你必须要掌握的!完整学习路线!!(建议收藏)》
  • 《奉劝那些刚参加工作的学弟学妹们:这些计算机与操作系统基础知识越早知道越好!万字长文太顶了!!(建议收藏)》
  • 《我用三天时间开发了一款老少皆宜的国民级游戏,支持播放音乐,现开放完整源代码和注释(建议收藏)!!》
  • 《我是全网最硬核的高并发编程作者,CSDN最值得关注的博主,大家同意吗?(建议收藏)》
  • 《毕业五年,从月薪3000到年薪百万,我掌握了哪些核心技能?(建议收藏)》
  • 《我入侵了隔壁妹子的Wifi,发现。。。(全程实战干货,建议收藏)》
  • 《千万不要轻易尝试“熊猫烧香”,这不,我后悔了!》
  • 《清明节偷偷训练“熊猫烧香”,结果我的电脑为熊猫“献身了”!》
  • 《7.3万字肝爆Java8新特性,我不信你能看完!(建议收藏)》
  • 《在业务高峰期拔掉服务器电源是一种怎样的体验?》
  • 《全网最全Linux命令总结!!(史上最全,建议收藏)》

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

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

  1. Android系统开发和性能优化——查漏补缺【建议收藏】

    做了这么久性能相关的工作,也接触了不少模块,说实话要做好性能这一块,真心不容易.为什么这么说? 是因为需要接触的知识实在是太多了, Android 是一个整体,牵一发而动全身,不是说只懂一个模块就可以 ...

  2. 全网最全的Python常见命令大全,建议收藏,以防备用

    这是本文的目录 前言 什么是命令行界面? 你在Python开发中需要CLI吗? CLI简介 Windows Mac Linux 用于Python开发的20多个最有用的CLI命令 安装命令 1.Choc ...

  3. 黑客常用SQL注入绕过技术总结!(冰河吐血整理,建议收藏)

    大家好,我是冰河~~ 今天给大家再次分享一篇硬核内容,那就是黑客常用的SQL注入绕过技术,还是那句话:我们学渗透技术不是为了攻击别人的系统,而是了解黑客常用的渗透技能,以此来修复我们自己系统中的漏洞, ...

  4. MySQL史上最全性能优化方式

    MySQL有哪些性能优化方式?这个问题可以涉及到 MySQL 的很多核心知识,就像要考你计算机网络的知识时,问你"输入URL回车之后,究竟发生了什么"一样,看看你能说出多少了. 所 ...

  5. C#实用杂记-EF全性能优化技巧

    原文链接:http://www.makmong.com/947.html#comment-31 EntityFramework 优化建议 2016年1月15日 下午4:54 LEILINKANG En ...

  6. iOS最全性能优化(下)

    续 性能优化(中) 22. 加速启动时间 快速打开app是很重要的,特别是用户第一次打开它时,对app来讲,第一印象太太太重要了. 你能做的就是使它尽可能做更多的异步任务,比如加载远端或者数据库数据, ...

  7. iOS最全性能优化(中)

    续 性能优化(上) 9. 重用和延迟加载(lazy load) Views 更多的view意味着更多的渲染,也就是更多的CPU和内存消耗,对于那种嵌套了很多view在UIScrollView里边的ap ...

  8. 2021全网最全Activiti7教程04(Activiti7进阶篇-欢迎收藏)

      本篇重点给大家介绍下Activiti中的高级内容,比如流程实例,个人任务,流程变量,组任务及网关. 全网最详细Activiti系列文章,强烈建议收藏加关注哦! Activiti进阶篇 1.流程实例 ...

  9. 2021全网最全Activiti7教程02(Activiti7入门使用-欢迎收藏)

    全网最详细Activiti系列文章,强烈建议收藏加关注哦! Activiti的入门应用 1Activiti的基本使用 1.1 创建Maven项目   创建一个普通的Maven项目,并添加相关的依赖 & ...

最新文章

  1. 一通骚操作,我把SQL执行效率提高了10000000倍!
  2. 喊了好久的AI落地究竟卡在哪里了?
  3. Windows Mobile下访问Sqlite的Native C++封装
  4. linux安装.net core3.0,树莓派4安装net core3.0环境
  5. python 面向对象编程 之 上下文管理协议
  6. matlab双重for训话,Question 2:
  7. python编程小案例_用Python3编程写第一个小案例!-Go语言中文社区
  8. Vue自定义指令-实时时间转换指令 v-time开发
  9. 安装ssr_网易《代号SSR》电脑版教程!
  10. [转载]Linux Shell 的快捷键
  11. 21个php常用方法汇总
  12. 11月国内网站流量统计:百度夺冠 360安全中心居亚
  13. 数据分析 超市条码_超市商品管理的11个常见问题 | 经验借鉴 | 商品管理
  14. 科技楼里面有三间计算机教室,中学计算机网络教室管理工作总结
  15. CentOS7怎么保存退出vi编辑
  16. PAL/PLA/GAL/CPLD/FPGA
  17. 国产银河数字式电子计算机是属于什么,邱桂香老师-计算机基础.ppt
  18. MessageBox 按钮显示英文或其他语言
  19. 金山词霸只能最大化,无法恢复小型查词界面
  20. 2014-2018年中国巨型计算机行业发展分析及投资研究报告

热门文章

  1. 机器学习中常说的CV是什么?
  2. 国内网络硬盘龙虎榜(转)
  3. 快速排序基准位置的选取方法和快速排序优化
  4. android内存卡哪些可以删除,安卓手机内存清理方法有哪些
  5. Linux安装Nginx,附Nginx安装包
  6. 基于深度学习的中文验证码识别----tensorflow
  7. 【人工智能】大脑传:人类对大脑的认识与历史
  8. 有没有测试眼型的软件,好看的眼型有这四个特征,第一个最高级,不妨自测一下自己的吧!...
  9. 使用Python计算化学式的相对分子质量
  10. 引用、指针和句柄的区别