性能优化方案详解,史上最全,必知必备!

简介: 本文详细解析了 9 大必备大厂优化方案,性能优化是一线互联网公司程序员的必备技能,非常重要。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。

关注△mikechen的互联网架构△,10年+BAT架构经验倾囊相授

大家好,我是 mikechen | 陈睿 。

性能优化可以说是一线互联网公司程序员的必备技能了,譬如 web网站调优、数据库、JVM调优、架构调优等方案。

本篇,我们重点解析 @mikechen

Web网站优化

image.png

1、尽可能减少HTTP请求
图片合并 (css sprites),Js脚本文件合并、css文件合并。

2、减少DNS查询

3、将css放在页面最上面,将js放在页面最下面

4、压缩js和css

减少文件体积,去除不必要的空白符、格式符、注释(即对代码进行格式化)

5、把js和css提取出来放在外部文件中

这一条要灵活运用,把js和css提取出来放在外部文件的优点是:减少html体积,提高了js和css的复用性,提高日后的可维护性

缺点是增加了http请求(可通过缓存来解决)。

6、避免重定向

重定向就是用户请求的页面被转移到了别的地方,浏览器向服务请请求一个页面,服务器告诉浏览器请求的页面已经被转移到另外一个页面,并告知另一个页面地址,浏览器就再发送请求到重定向的地址。这样会增加服务器和浏览器之间的往返次数,影响网站性能。

重定向状态码有:301永久重定向 302临时重定向。304 not modified 并不是真的重定向,它是用来告诉浏览器get请求的文件在缓存中,避免重新下载。

7、移除重复脚本

8、使用ajax缓存

ajax的get和post方法:

只要是浏览器的get请求,浏览器都会使用缓存,对于同一地址的请求,服务器会发送304状态码到浏览器,浏览器就会使用缓存中的数据

post的请求每次都会被执行,浏览器不会缓存

10、使用Gzip压缩

11、使用CDN(内容分发网络)

数据库性能优化

数据库的调优,总的来说分为以下部分:

image.png

1.SQL调优
主要集中在索引、减少跨表与大数据join查询等。

2.数据库端架构设计优化

通过读写分离调整对数据库的写操作,通过垂直拆分以及水平拆分(分库分表)来解决数据库端连接池瓶颈等问题。

3.连接池调优

可以通过熟悉连接池的原理,以及具体的连接池监控数据,来不断调试出最终的连接池参数。

缓存性能优化

目前分布式缓存已经比较成熟,常见的有redis等。

image.png

选型考虑

如果数据量小,并且不会频繁地增长又清空(这会导致频繁地垃圾回收),那么可以选择本地缓存。具体的话,如果需要一些策略的支持(比如缓存满的逐出策略),可以考虑Ehcache;如不需要,可以考虑HashMap;如需要考虑多线程并发的场景,可以考虑ConcurentHashMap。

缓存是否会满,缓存满了怎么办?

对于一个缓存服务,理论上来说,随着缓存数据的日益增多,在容量有限的情况下,缓存肯定有一天会满的。如何应对?

① 给缓存服务,选择合适的缓存逐出算法,比如最常见的LRU。

② 针对当前设置的容量,设置适当的警戒值,比如10G的缓存,当缓存数据达到8G的时候,就开始发出报警,提前排查问题或者扩容。

③ 给一些没有必要长期保存的key,尽量设置过期时间。

异步性能优化

image.png

使用场景

用户并不关心或者用户不需要立即拿到这些事情的处理结果,这种情况就比较适合用异步的方式处理,这里的原则就是能异步就异步。

常见做法

1)额外开辟线程

这里可以采用额外开辟一个线程或者使用线程池的做法,在IO线程(处理请求响应)之外的线程来处理相应的任务,在IO线程中让response先返回。

如果异步线程处理的任务设计的数据量非常巨大,那么可以引入阻塞队列BlockingQueue作进一步的优化。具体做法是让一批异步线程不断地往阻塞队列里扔数据,然后额外起一个处理线程,循环批量从队列里拿预设大小的一批数据,来进行批处理(比如发一个批量的远程服务请求),这样进一步提高了性能。

2)使用消息队列(MQ)中间件服务,MQ天生就是异步的。

JVM性能优化

image.png

什么时候调?

通过监控系统对一些机器关键指标(gc time、gc count、各个分代的内存大小变化、机器的Load值与CPU使用率、JVM的线程数等)的监控报警,也可以看gc log和jstat等命令的输出,再结合线上JVM进程服务的一些关键接口的性能数据和请求体验,基本上就能定位出当前的JVM是否有问题,以及是否需要调优。

调优工具:

Jconsole,jProfile,VisualVM

Jconsole :
jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用。对垃圾回收算法有很详细的跟踪。详细说明参考这里

JProfiler:
商业软件,需要付费。功能强大。详细说明参考这里

VisualVM:
JDK自带,功能强大,与JProfiler类似。推荐。

如何调优?

观察内存释放情况、集合类检查、对象树

上面这些调优工具都提供了强大的功能,但总的来说,一般分为以下几类功能:

1)堆信息查看

可查看堆空间大小分配(年轻代、年老代、持久代分配)

image.png

2)提供即时的垃圾回收功能

3)垃圾监控(长时间监控回收情况)

image.png

4)查看堆内类、对象信息查看:数量、类型等

5)对象引用情况查看

有了堆信息查看方面的功能,我们一般可以顺利解决以下问题:

  • 年老代年轻代大小划分是否合理
  • 内存泄漏
  • 垃圾回收算法设置是否合理

6)线程监控

image.png

线程信息监控:系统线程数量。

线程状态监控:各个线程都处在什么样的状态下

Dump线程详细信息:查看线程内部运行情况

7)死锁检查

8)热点分析

  • CPU热点:检查系统哪些方法占用的大量CPU时间
  • 内存热点:检查哪些对象在系统中数量最大(一定时间内存活对象和销毁对象一起统计)

这两个东西对于系统优化很有帮助。

我们可以根据找到的热点,有针对性的进行系统的瓶颈查找,以及进行系统优化,而不是漫无目的地进行所有代码的优化。

9)快照

快照是系统运行到某一时刻的一个定格。

在我们进行调优的时候,不可能用眼睛去跟踪所有系统变化,依赖快照功能,我们就可以进行系统两个不同运行时刻,对象(或类、线程等)的不同,以便快速找到问题

举例说,我要检查系统进行垃圾回收以后,是否还有该收回的对象被遗漏下来的了。那么,我可以在进行垃圾回收前后,分别进行一次堆情况的快照,然后对比两次快照的对象情况。

10)内存泄漏检查

内存泄漏是比较常见的问题,而且解决方法也比较通用,这里可以重点说一下,而线程、热点方面的问题则是具体问题具体分析了。

内存泄漏一般可以理解为系统资源(各方面的资源,堆、栈、线程等)在错误使用的情况下,导致使用完毕的资源无法回收(或没有回收),从而导致新的资源分配请求无法完成,引起系统错误。

内存泄漏对系统危害比较大,因为他可以直接导致系统的崩溃。

性能优化总结

大型网站的性能瓶颈大部分瓶颈都在数据库端,所以,性能调优总是沿着如何减少对后端的压力来操作。

  1. 数据库端的瓶颈,经常会造成应用端的雪崩,例如:sql查询过长,长事务等,所以需要及时解决后端性能。
  2. 通过读写分离、垂直拆分、水平拆分,降低对数据库后端的压力。
  3. 通过优化sql语句,索引等,缩短对sql的查询时间。
  4. 通过缓存以及CDN,来解决对图片、文件等的读操作,避免对数据库产生压力。
  5. 通过对web端的优化,js、css等压缩,提高大文件读取时间,尽量依赖CDN。
  6. 还有一个重点就是监控:对JVM、线程、sql查询时间等健康指标就行及时监控,通过监控及时发现瓶颈,及时优化。

以上,是9大性能优化方案的详细解析,欢迎评论区留言交流或拓展。

我是 mikechen | 陈睿 ,关注【mikechen的互联网架构】,10年+BAT架构技术倾囊相授。

本文已同步我的技术博客 www.mikechen.cc,更新至我原创的《30W+字大厂架构技术合集》中。

相关文章
|
8月前
|
SQL 人工智能 前端开发
2026年计算机毕业设计前端框架怎么选?Vue和React优缺点深度对比
本文针对本科毕业设计场景,从学习成本、生态成熟度、毕设适配度和导师认可度四维度对比Vue与React,推荐零基础学生首选Vue3——中文文档完善、上手快、组件丰富(如Element Plus)、调试友好,两周即可完成高质量前端项目,助力高效通过答辩。
|
关系型数据库 MySQL 数据处理
基于python的化妆品销售分析系统
本项目基于Python构建化妆品销售分析系统,结合Django框架与MySQL数据库,实现销售数据的采集、处理、分析与可视化,助力企业精准营销与决策优化,推动化妆品行业数字化转型。
HarmonyOS实战:Tab顶部滑动悬停功能实现
在鸿蒙开发中,实现Scroll嵌套List列表滑动时顶部悬停的效果是一个常见需求。本文详细介绍了如何通过布局和事件处理来实现这一功能。首先,使用Scroll嵌套List和Tab布局来构建基础页面。然后,通过设置nestedScroll属性为NestedScrollMode.PARENT_FIRST,确保外层Scroll优先滑动。接着,通过监听List和Scroll的滑动事件,处理滑动冲突,确保在特定条件下Scroll停止滑动,将滑动事件交给List处理。最终,实现了在上下滑动时优先让Scroll滑动的效果,并提供了扩展思路,如优先让List滑动等。
672 10
HarmonyOS实战:Tab顶部滑动悬停功能实现
|
缓存 监控 Java
大厂性能优化的10大顶级方案 (万字图文史上最全)
本文详细介绍了大厂性能优化的10大顶奢方案,涵盖代码优化、缓存优化、异步优化、多线程优化、前端优化、微服务架构优化、硬件升级、数据库优化、过载保护优化以及度量与监控系统等方面。每部分不仅提供了理论知识,还结合实际案例和代码示例,帮助读者全面理解和应用这些优化策略。文章还特别强调了架构设计的重要性,指出架构师需要具备多方面的知识和技能,包括硬件、软件、网络协议、分布式知识等,以应对复杂的技术挑战。最后,作者尼恩分享了自己多年的经验,提供了丰富的技术资源和实战指导,助力读者在面试和工作中取得成功。
大厂性能优化的10大顶级方案 (万字图文史上最全)
|
数据采集 运维 测试技术
软件测试之道 -- 做一个有匠心的程序员
作者一年前围绕设计模式与代码重构写了一篇《代码整洁之道 -- 告别码农,做一个有思想的程序员!》的文章。本文作为续篇,从测试角度谈程序员对软件质量的追求。
1050 17
|
前端开发 测试技术 API
2025年API开发必备:10款优秀Postman替代工具大盘点
API测试在现代开发中至关重要,Postman虽为首选,但市场上涌现出许多优秀替代工具。本文精选2025年10款好评如潮的API测试工具:Apifox、Insomnia、Hoppscotch、Paw、Talend API Tester、HTTPie、ARC、Swagger UI、SoapUI和Thunder Client。这些工具各具特色,满足不同需求,如团队协作、开源易用、自动化测试等。无论是简洁轻量还是功能全面,总有一款适合你的团队,助力效率提升。
9058 122
|
机器学习/深度学习 人工智能 运维
AI加持的系统性能优化:别让你的服务器“累趴下”
AI加持的系统性能优化:别让你的服务器“累趴下”
732 12
|
监控 安全 网络协议
端口(Port)
本文介绍了计算机网络中的端口概念,包括定义、作用和分类。端口用于区分不同应用程序,支持多路复用与分解。熟知端口(0-1023)为常见服务预留,注册端口(1024-49151)需注册使用,动态端口(49152-65535)由系统分配。文中还探讨了端口在服务器、客户端和网络设备中的应用,以及端口扫描技术和安全管理措施,如关闭不必要的端口、使用防火墙和端口转发,以保障网络安全。最后总结了端口在高效通信与安全防护中的重要作用。
2095 17
|
人工智能 前端开发 API
手动开发?给我一条提示词,CodeBuddy能做的你都做不到!
本文介绍了使用CodeBuddy完成的一个五一期间的小项目,主要展示其编码能力。项目采用基础的HTML+CSS+JS实现界面,也提到可用React或Next.js复刻。文章重点讲解了通过提示词生成代码的方法,包括局部和整体两种方式,并展示了AI旅行规划功能的实现过程。通过与模型对话调整细节,最终生成满意的界面。CodeBuddy在前后端开发中表现出强大能力,未来可结合绘画作品生成惊艳网站。