全网最全性能优化总结!!(冰河吐血整理,建议收藏)_保 化优化整体性能优化4个 启束 个-程序员宅基地

技术标签: 性能调优  我要进大厂  大厂Offer  程序员进阶  精通性能优化系列  

大家好,我是冰河~~

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

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

写在最后

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

推荐阅读:

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/l1028386804/article/details/118175154

智能推荐

Mysql学习_InnoDB On-Disk Structures_TABLE_mysql table is disabled-程序员宅基地

文章浏览阅读409次。InnoDB On-Disk StructuresTableCreating InnoDB Tables:CREATE TABLE t1 (a INT, b CHAR (20), PRIMARY KEY (a)) ENGINE=InnoDB;You do not need to specify the ENGINE=InnoDB clause if InnoDB is defined ..._mysql table is disabled

bzoj3296: [USACO2011 Open] Learning Languages(并查集)-程序员宅基地

文章浏览阅读248次。题目传送门 。解法: 并查集。 一头牛连向他能说的语言。 然后可以通过翻译的话就相当于双向边咯。 意思就是牛可以去找语言,语言也可以找牛。 最后记录有多少个不同的集合-1即可代码实现:#include<cstdio>#include<cstring>#include<cstdlib>#include<iostream&gt..._bzoj3296

无线接入认证web服务器搭建,基于WEB和RADIUS的无线局域网接入认证系统-程序员宅基地

文章浏览阅读1.2k次。摘要:无线局域网的安全运营管理是近年的研究热点,而用户的接入认证是网络安全管理和运营的基础.常见的接入认证技术有PPPoE,IEEE 802.1x和Web认证三种.本文针对无线局域网的特点,以用户进行认证的便利性和易于维护性为依据,致力于开发基于WEB和RADIUS(远端拨入用户认证服务)的接入认证系统. 论文首先进行WEB认证系统总体设计,选择Linux作为开发环境.通过深入剖析Netfilte..._wifi web认证服务器搭建

解决conda 安装时的HTTP报错CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com/pkgs_linux conda 报错 condahttperror: http 000 connection-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。错误代码:CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com/pkgs/main/linux-64/current_repodata.json>Elapsed: -An HTTP error occurred when trying to retrieve this URL.HTTP errors are often intermittent, and a simple retry _linux conda 报错 condahttperror: http 000 connection failed for url <>

linux终端声音设置,终端命令设置音量?-程序员宅基地

文章浏览阅读510次。问题描述我有一个外部声卡,大部分工作正常,除了第一次插入时或打开笔记本电脑时,音量设置为100%。也就是整个系统音量,如声音指示器所示。我正在寻找的是一个终端命令,将该音量设置为50%,这样我就可以在登录时运行它,而不必担心如果我忘记了转动,我播放的第一个音频会在我身上发出声音音量降低。哪些命令允许您更改该音量,即声音指示器中的音量?我用gsettings和dbus四处探索,但一直无法找到任何可以..._amixer -q -d pulse sset master 5%- unmute

form表单,formdata对象,实现文件上传_formdata文件上传-程序员宅基地

文章浏览阅读3.1k次。action提交表单时,向何处发送表单数据target在何处打开url_blank在新窗口打开_self在同一个窗口打开默认_parent_topmethod属性以何种方式把表单数据提交到actionurlGET/POSTenctype属性发送表单数据之前如何对数据进行编码——上传图片post......_formdata文件上传

随便推点

android Listview 软引用SoftReference异步加载图片_listview软引用-程序员宅基地

文章浏览阅读1.9k次。网上软应用的例子很多,我也是借鉴别人修改了下,推荐一个网址:http://www.iteye.com/topic/685986 之前总是不太理解,今天认真的推敲下,记录下来方便以后用到. HashMap> imageCache 关于SoftReference这个类多少知道些机制,会用就ok了。 机制:简单来说,她会帮助我们管理内存,防止内存溢出,另外一点也_listview软引用

spark1.0-集群搭建_e5 2690-程序员宅基地

文章浏览阅读832次。背景机器环境:部门有10台服务器,每台配置为:intel E5-2690 v3 48核,775Gb内存。搭建了hdfs,hive,spark,并且spark的资源调度方案为yarn模式。因为资源分配有限。故而在自己组所拥有的6台服务器上,手动搭建spark集群,每台配置为:intel E5-2670 v3 48核,128Gb内存,18T硬盘(一个驱动控制器口)。 任务:20T压缩包(压缩率3左右,_e5 2690

《自然语言处理:数字化时代的语言智慧》_体系化智能nlp-程序员宅基地

文章浏览阅读1.1k次,点赞45次,收藏31次。随着数字化时代的来临,自然语言处理(NLP)技术正在成为信息处理和人机交互的核心技术之一。本文将围绕NLP的技术进展、技术原理、行业应用案例、面临的挑战与机遇以及未来趋势进行详细探讨。_体系化智能nlp

Python 3+Django 3 结合Vue.js框架构建前后端分离Web开发平台实战-程序员宅基地

文章浏览阅读3k次,点赞2次,收藏35次。学习全文大概需要 12分钟,内容实战性较强。1. 前言本篇将基于Python 3.7+Django 3.0结合Vue.js前端框架,为大家介绍如何基于这三者的技术栈来实现一个前端后离的W..._python+django+mysql+vue前后端分离开发的小型电子商务管理系统

flutter框架简单学习_flutter框架语法学习-程序员宅基地

文章浏览阅读269次。flutter框架最近在搞大创,主要课题就是flutter开发,简单认识一下本文将widget称为控件项目开篇介绍一个Flutter项目从main函数中的runApp调用开始。在ranApp函数中所接收的控件会成为整个屏幕的根控件,并覆盖在整个屏幕。(可以将这个控件理解成iOS中的rootViewController或android中在manifest文件中配置的mainActivity的界面)。而其他的控件(widget)都是在这个根控件上添加的。import 'package:flutter/_flutter框架语法学习

兼容性测试神器 responsively-app_responsivelyapp-程序员宅基地

文章浏览阅读5.8k次,点赞3次,收藏11次。官网 https://responsively.app/下载地址 https://github.com/manojVivek/responsively-app/releases当时v0.1.6,DIY设备信息后,不然新设备不会显示,还自动添加所有默认设备。几十个设备一起添加到首页,当时我的电脑直接蜂鸣了。。目前版本v0.2.0,v0.1.6那个致命bug终于修复了。自定义设备只需要填写相关信息就可以了,User-Agent可以从浏览器Copy过来比较真实。..._responsivelyapp