揭秘Java性能调优的层次 | 综合多方向提升应用程序性能与系统高可用的关键(架构层次规划)
揭秘性能调优的层次 | 综合多方向提升应用程序性能与系统的高可用
- 前言介绍
- 调优层次
- 调优 — 设计
- 案例说明 - 操作轮询控制
- 事件驱动
- 调优 — 代码
- 案例说明 - ArrayList和LinkedList性能对比
- 案例说明 - 文件读写实现方式的性能对比
- 调优 — JVM
- JVM架构分布
- JVM调优方向
- **JVM垃圾回收类型组合及其适用场景**
- 调优 — 数据库
- 调优 — 系统
- 总结分析
注意:特此声明:本文章首发文章在掘金:https://juejin.cn/post/7341416970938646565,未经允许,请勿进行侵权私自转载。
前言介绍
在信息技术飞速发展的时代,Java作为一种成熟、稳定且广泛应用的编程语言,已成为构建企业级应用的首选。然而,随着业务需求的日益复杂和数据处理量的不断增大,Java应用程序和系统性能调优变得愈发重要。性能调优不仅仅是一个技术挑战,更是确保系统高可用性和用户体验的关键。要实现这一目标,开发人员需要深入理解Java性能调优的多个层次,并综合运用各种手段和技术,从代码到架构,从虚拟机到操作系统,全面提升应用程序和系统的性能。
调优层次
为了全面提升系统的性能,开发人员需要采取一种全方位、多层次的优化策略。除了进行常见的代码层面的优化之外,还应深入探索软件架构、JVM虚拟机层、数据库管理系统以及操作系统等各个层面,通过针对性的手段和技术实现性能调优。这种综合性的优化方法能够确保系统在不同层面上都达到最佳性能状态,从而实现整体性能的大幅提升。

接下来,我们将逐一深入探讨上述各个层次的优化策略,并为您呈现详尽的分析与介绍。我们相信,通过了解这些层次化的优化方法,您将能够从中汲取宝贵的经验,为您的Java应用程序和系统性能调优之路提供有力的指导。
调优 — 设计
设计调优在整个调优手段中占据至关重要的地位,它被视为一种前瞻性的策略,通常在软件开发周期的早期阶段便进行。在这一阶段,软件架构师扮演着举足轻重的角色,他们需要全面评估系统可能遭遇的各种潜在问题和挑战,从而制定出合理且高效的设计方案。
** 精心设计和优化,我们能够在根本上提升系统的稳定性、可扩展性和性能表现,为后续的微观优化奠定坚实的基础,设计优化的一个显著优势在于其能够巧妙地规避特定组件的性能瓶颈,而非仅仅针对该组件本身进行改进**。
案例说明 - 操作轮询控制
某个组件A为例,它依赖于某事件E的发生来触发特定行为。若组件A通过持续循环来监控事件E的发生,其监控行为无疑会占用一定的系统资源。
开发人员面临一个挑战:如何在监控频率和系统资源消耗之间找到最佳的平衡点。如果监控频率设置得过低,虽然能够减少资源消耗,但可能导致系统的实时响应性下降,影响用户体验。从代码层面上努力找到一个最为恰当的监控频率,以确保在资源消耗和实时响应性之间达到最佳的平衡。然而,这样的调优往往受限于代码本身的结构和逻辑,可能难以从根本上解决问题。
相比之下,设计优化则能够以一种更为高效和灵活的方式来解决这一问题。通过重新设计系统的架构或流程,开发人员可以规避组件A对事件E的持续监控需求,从而彻底消除由此产生的性能瓶颈。
事件驱动
如果将这一问题在设计层面加以解决,我们可以采用事件通知的机制来重构系统的行为。具体而言,我们可以利用观察者模式——来实现事件E与组件A之间的解耦。当事件E发生时,它能够主动通知组件A,从而触发组件A的相应行为。
通过事件通知的方式,系统能够更加高效、灵活地响应各种事件,提升了整体性能和用户体验。这种设计方式巧妙地避免了使用可能存在性能隐患的循环监控机制,从根本上解决了资源消耗和实时响应性之间的矛盾。
开发人员在软件设计的初期就必须深入考虑系统的性能问题,以确保系统的稳定性和高效性。通过在设计阶段精心规划和优化,可以大大减少后续开发过程中的性能瓶颈和隐患,从而提升整个系统的质量和用户体验。
调优 — 代码
代码调优是在软件开发流程中,尤其是在软件维护阶段,对程序代码进行的持续改进和优化过程。这一环节要求开发人员熟练掌握并运用相关编程语言的API,确保在恰当的场景下使用合适的API或类库。此外,对算法和数据结构的深刻理解与灵活运用,同样是代码优化的核心要素。通过运用这些编码技巧和策略,开发人员能够显著提升代码的质量和效率,从而优化整体系统性能。
案例说明 - ArrayList和LinkedList性能对比
以List的实现为例,LinkedList和ArrayList在随机访问性能上的差异可能达到几个数量级,下面便是两种实现类的对比介绍:
| ArrayList | LinkedList | |
|---|---|---|
| 性能 | ||
| 随机访问 | 高效 | 低效 |
| 插入/删除元素 | 中等效率,中间位置操作较慢 | 高效,特别是头尾位置 |
| 内存使用 | 连续内存空间,空间利用率高 | 分散内存空间,空间利用率低 |
| 扩容行为 | 需要重新分配内存并复制元素,扩容因子为1.5 | 无需重新分配内存,只需修改指针 |
| 线程安全 | 非线程安全 | 非线程安全 |
| 数据结构 | 基于动态数组 | 基于双向链表 |
| 遍历速度 | 较快,通过索引直接访问 | 较慢,需要从头或尾开始遍历 |
| 元素顺序 | 有序 | 有序 |
| 应用场景 | 频繁随机访问,较少插入和删除操作 | 频繁插入和删除操作,特别是头尾位置 |
因此,尽管代码优化相对于设计优化而言,可以被视为微观层面的优化,但它在提升系统性能方面却具有最直接的影响。开发人员应当深入研究和应用各种编码技巧、算法和数据结构,以确保代码实现的高效和稳定。通过精心设计的代码优化,我们可以显著提升系统的整体性能,为用户带来更好的体验。
案例说明 - 文件读写实现方式的性能对比
同样地,文件读写的实现方式也会显著影响性能,如使用传统的IO流与Java NIO相比,性能差距可能又是一个数量级,
| 传统IO流 | Java NIO | |
|---|---|---|
| 性能 | ||
| I/O效率 | 相对较低 | 相对较高 |
| 阻塞/非阻塞 | 阻塞I/O | 非阻塞I/O |
| 数据缓冲 | 字节流/字符流 | 缓冲区(Buffer) |
| 通道(Channel) | 无 | 支持 |
| 选择器(Selector) | 无 | 支持 |
| 内存使用 | 每次I/O操作都涉及内核与用户空间的数据拷贝 | 减少了内核与用户空间的数据拷贝次数 |
| 应用场景 | 小文件读写,简单I/O操作 | 大文件读写,高并发I/O操作,网络编程等 |
Java NIO通过引入缓冲区、通道和选择器等概念,提供了更高效、更灵活的文件和网络I/O处理能力。然而,具体性能差异还会受到多种因素的影响,如文件大小、操作系统、硬件配置等。
调优 — JVM
鉴于Java软件始终运行在JVM虚拟机之上,对JVM虚拟机的调优工作对于提升Java程序的性能具有不可忽视的作用。这种调优通常在软件开发的后期阶段进行,例如软件开发完成后或在达到某一关键里程碑时。通过对JVM的精细调整,我们可以进一步压榨系统的性能,从而为用户提供更为流畅和高效的体验。
JVM架构分布
作为Java软件运行的基石,JVM(Java Virtual Machine)的各类参数设置直接关系到Java程序的性能表现。例如,JVM的堆内存大小配置和垃圾回收(Garbage Collection,GC)策略选择等,都是影响程序运行效率和稳定性的重要因素。
为了进行有效的VM层面调优,开发人员需要对JVM的运行机制和内存布局有深入的了解。这包括堆内存的结构、不同种类的GC机制等。
JVM调优方向
JVM调优主要涉及两个方面:合理的堆内存大小配置和垃圾回收算法的选择,例如下面的配置案例:
# 设置堆内存
-Xmx4g -Xms4g
# 指定 GC 算法
-XX:+UseG1GC -XX:MaxGCPauseMillis=50
# 指定 GC 并行线程数
-XX:ParallelGCThreads=4
# 打印 GC 日志
-XX:+PrintGCDetails -XX:+PrintGCDateStamps
# 指定 GC 日志文件
-Xloggc:gc.log
# 指定 Meta 区的最大值
-XX:MaxMetaspaceSize=2g
# 设置单个线程栈的大小
-Xss1m
# 指定堆内存溢出时自动进行 Dump
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/usr/local
JVM垃圾回收类型组合及其适用场景
在JVM中,垃圾回收(GC)机制分为新生代收集器和老年代收集器两部分。这两部分的收集器需要协同工作,以确保内存的有效管理和程序的稳定运行。
在此基础上,根据具体应用程序的特点和需求,合理设置JVM的启动参数,如堆大小、GC策略等,以确保程序能够以最优的状态运行。通过这样的调优措施,我们可以进一步提升Java程序的性能,确保其在各种场景下都能展现出卓越的性能和稳定性。
调优 — 数据库
对于绝大多数应用系统而言,数据库扮演着不可或缺的角色。在Java程序中,数据库连接通常通过数据库连接池(Database Connection Pooling, DBC)来实现,以提高数据库访问的性能和效率。针对数据库的调优,可以大致划分为以下三个关键部分:
-
SQL查询优化:优化SQL查询语句是数据库调优的基础。通过合理的索引设计、避免全表扫描、减少不必要的数据库连接和查询次数等手段,可以显著提高数据库查询的响应速度和效率,例如下面几种方案:
- 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
- 应尽量避免在 where 子句中对字段进行 null 值判断,创建表时NULL是默认值,但大多数时候应该使用NOT NULL,或者使用一个特殊的值,如0,-1作为默 认值。
- 应尽量避免在 where 子句中使用!=或<>操作符, MySQL只有对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE。
- 应尽量避免在 where 子句中使用 or 来连接条件, 否则将导致引擎放弃使用索引而进行全表扫描, 可以使用UNION合并查询:
select id from order where num=100 union all select id from t where num=200 - in 和 not in 也要慎用,否则会导致全表扫描,对于连续的数值,能用 between 就不要用 in 了:
select id from order where num between 1 and 5
-
数据库结构设计:合理的数据库结构对于系统性能至关重要。包括表的设计、字段的选择、索引的创建、分区策略等都需要根据实际应用场景来精细调整。正确的数据库结构设计可以有效减少数据冗余、提高数据查询和更新的速度。
- 一般来说,数据库中的表越小,在它上面执行的查询也就越快。因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度舍得尽可能小。
-
数据库参数调优:数据库系统本身也提供了许多参数供用户调整,以适应不同的应用场景。这些参数涉及内存分配、磁盘I/O、并发连接数、缓存大小等各个方面。通过对这些参数的合理配置和调优,可以进一步提升数据库的整体性能和稳定性。
数据库调优是一个涉及多个方面的综合性工作。通过SQL查询优化、数据库结构设计和数据库参数调优这三个方面的综合考虑和实践,可以显著提升应用系统的数据库访问性能,从而优化整体系统的性能和用户体验。
调优 — 系统
操作系统作为软件运行的核心平台,对应用系统的性能起着至关重要的作用。不同种类的操作系统,其调优的方法和参数设置各异。以主流UX系统为例,共享内存段、信号量、共享内存最大值(shmmax)、共享内存最小值(shmmin)等系统资源均可进行优化,以提升系统性能。此外,如最大文件句柄数、虚拟内存大小、磁盘块大小等参数同样可能对软件性能产生显著影响。
通过上述的合理配置和优化,可以有效提升操作系统的性能,进而为应用系统提供更为稳定、高效的运行环境。对于系统管理员和开发人员而言,深入理解操作系统性能调优的原理和方法,将有助于他们更好地管理和优化软件运行环境,提升应用系统的整体性能。
总结分析
优化工作涉及多个层面,每个层面都有其独特的优化手段和影响。通过综合考虑和协调这些层面的优化,可以全面提升应用系统的性能和稳定性。
- 设计:设计是优化的起点,好的设计能够确保系统的可扩展性、可维护性和性能。
- 代码:代码是实现设计的具体表现,高质量的代码直接影响系统的性能和稳定性。
- JVM:JVM是Java应用的运行环境,其性能对Java应用有直接的影响。
- 数据库:数据库是应用系统中存储和查询数据的核心组件,其性能直接影响应用的整体性能。
- 系统:系统层面的优化涉及服务器的硬件配置、操作系统的选择和配置、网络环境等多个方面,是确保应用稳定运行和高效执行的基础。
相关文章:
揭秘Java性能调优的层次 | 综合多方向提升应用程序性能与系统高可用的关键(架构层次规划)
揭秘性能调优的层次 | 综合多方向提升应用程序性能与系统的高可用 前言介绍调优层次调优 — 设计案例说明 - 操作轮询控制事件驱动 调优 — 代码案例说明 - ArrayList和LinkedList性能对比案例说明 - 文件读写实现方式的性能对比 调优 — JVMJVM架构分布JVM调优方向**JVM垃圾回…...
事件循环解析
浏览器的进程模型 何为进程? 程序运行需要有它自己专属的内存空间,可以把这块内存空间简单的理解为进程 每个应用至少有一个进程,进程之间相互独立,即使要通信,也需要双方同意。 何为线程? 有了进程后&…...
物联网技术助力智慧城市安全建设:构建全方位、智能化的安全防护体系
一、引言 随着城市化进程的加速和信息技术的迅猛发展,智慧城市已成为现代城市发展的重要方向。在智慧城市建设中,安全是不可或缺的一环。物联网技术的快速发展为智慧城市安全建设提供了有力支持,通过构建全方位、智能化的安全防护体系&#…...
mac打不开xxx软件, 因为apple 无法检查其是否包含恶意
1. 安全性与隐私下面的允许来源列表,有些版本中的‘任何来源’选项被隐藏了,有些从浏览器下载的软件需要勾选这个选项才能安装 打开‘任何来源’选项 sudo spctl --master-disable 关闭‘任何来源’选项 sudo spctl --master-enable...
《深入浅出红黑树:一起动手实现自平衡的二叉搜索树》
一、分析 1. 红黑树的性质 红黑树是一种自平衡的二叉搜索树,它具有以下五个性质: (1)节点是红色或黑色。 (2)根节点是黑色。 (3)所有叶子节点(NIL节点)是…...
C++——模版
前言:哈喽小伙伴们好久不见,这是2024年的第一篇博文,我们将继续C的学习,今天这篇文章,我们来习一下——模版。 目录 一.什么是模版 二.模版分类 1.函数模版 2.类模板 总结 一.什么是模版 说起模版,我们…...
《TCP/IP详解 卷一》第9章 广播和组播
目录 9.1 引言 9.2 广播 9.2.1 使用广播地址 9.2.2 发送广播数据报 9.3 组播 9.3.1 将组播IP地址转换为组播MAC地址 9.3.2 例子 9.3.3 发送组播数据报 9.3.4 接收组播数据报 9.3.5 主机地址过滤 9.4 IGMP协议和MLD协议 9.4.1 组成员的IGMP和MLD处理 9.4.2 组播路由…...
备战蓝桥杯---动态规划的一些思想1
话不多说,直接看题: 目录 1.双线程DP 2.正难则反多组DP 3.换个方向思考: 1.双线程DP 可能有人会说直接贪心:先选第1条的最优路径,再选第2条最优路径。 其实我们再选第1条时,我们怎么选会对第2条的路径…...
基于BERTopic模型的中文文本主题聚类及可视化
文章目录 BERTopic简介模型加载地址文本加载数据处理BERTopic模型构建模型结果展示主题可视化总结BERTopic简介 BERTopic论文地址:BERTopic: Neural topic modeling with a class-based TF-IDF procedure BERTopic是一种结合了预训练模型BERT和主题建模的强大工具。它允许我…...
MySQL:函数
提醒: 设定下面的语句是在数据库名为 db_book里执行的。 创建user_info表 注意:pwd为密码字段,这里使用了VARCHAR(128)类型,为了后面方便对比,开发项目里一般使用char(32),SQL语句里使用MD5加密函数 USE db…...
C/C++内存管理及内存泄漏详解
目录 C/C内存分布 C语言中动态内存管理方式:malloc/calloc/realloc/free C内存管理方式 new/delete操作内置类型 new和delete操作自定义类型 operator new与operator delete函数 new和delete的实现原理 内置类型 自定义类型 内存泄漏 概念 内存泄漏分类 ⭐…...
什么是系统工程(字幕)41
0 00:00:01,650 --> 00:00:01,884 好 1 00:00:01,884 --> 00:00:06,330 那这个时候我们就可以把它绑定到上面了 2 00:00:06,610 --> 00:00:07,940 那我们来看 3 00:00:11,710 --> 00:00:12,930 幻灯片上 4 00:00:15,530 --> 00:00:15,885 5 00:00:15,885 --…...
测开新手:pytest+requests+allure自动化测试接入Jenkins学习
最近在这整理知识,发现在pytest的知识文档缺少系统性,这里整理一下,方便后续回忆。 在python中,大家比较熟悉的两个框架是unittest和pytest: Unittest是Python标准库中自带的单元测试框架,Unittest有时候…...
学习网络编程No.11【传输层协议之UDP】
引言: 北京时间:2023/11/20/9:17,昨天成功更文,上周实现了更文两篇,所以这周再接再厉。当然做题任在继续,而目前做题给我的感觉以套路和技巧偏多,还是那句话很多东西不经历你就是不懂ÿ…...
向爬虫而生---Redis 基石篇6 <拓展HyperLogLog>
前言: 继续之前的 向爬虫而生---Redis 基石篇5 <拓展Zset>-CSDN博客 一些比较基础的redis类型在初中级阶段用着没有毛病,但是到了大数据时代,慢慢一些更高级的场景,就需要把这几个类型搬出来了! 正文: 概念: 当我们需要对一个大型数据集进行去重计…...
JavaScript中的this
在实际应用中,了解 this 的行为是非常重要的,特别是在编写库或框架时,或者当你需要在回调函数中访问特定的上下文时,通常推荐使用箭头函数或者其他方法来确保 this 的正确指向。 在ES6中,this 的值取决于它是如何被调用…...
宝塔php站点设置伪静态规则 访问 a.com 时候跳转到 a.com/b.html
要在宝塔 PHP 站点中设置伪静态规则,实现访问a.com时跳转到a.com/b.html,可以按照以下步骤进行操作: 打开宝塔面板并登录到你的服务器管理界面。进入网站设置页面,找到你要设置伪静态规则的 PHP 站点。在站点设置中,找…...
git介绍4.2
git(版本控制工具) 一、git 介绍 1、git是目前世界上最先进的分布式版本控制系统,可以有效,高速的处理从小到大的项目版本管理。 2、git是linux torvalds 为了帮助管理linux内核开发二开发的一个开放源码的版本控制软件。 3、git作用:更好…...
【深入了解设计模式】组合设计模式
组合设计模式 组合模式是一种结构型设计模式,它允许你将对象组合成树状结构来表现“整体-部分”关系。组合模式使得客户端可以统一对待单个对象和组合对象,从而使得代码更加灵活和易于扩展。 概述 对于这个图片肯定会非常熟悉,上图我们可…...
4.Java---方法+重载
方法 方法的调用是需要开辟内存的,方法调用结束内存就被销毁了. 下面将介绍一个经典的错误标准的0分的示意! 我们日常中写交换两个数字的代码的时候都会用如下的方法进行描述: 你是不是觉得自己写的特别对!终于可以独立写一个小小的函数了? 下面运行一下看看结果 哦莫!怎么…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
