二、Java性能概述

简介: 二、Java性能概述


👋Java性能概述

Java之父 James Gosling 的一句很经典的话:

Java 是一门蓝领语言。它不是博士论文材料,而是用于工作的语言。—— James Gosling

言外之意,Java一直是一种强调实用性的语言。它一开始对性能的态度是,只要环境足够快并且能提升开发效率,就可以牺牲原始性能。所以直到近些年,随着诸如HosSpot之类的JVM日趋成熟和进步,Java环境才开始适合于高i性能计算应用程序。

这种实用性在Java平台中以多种方式体现出来,但最明显的一点就是使用了托管子系统。其理念是,开发人员无需担心托管环境下的某些功能细节,而代价是放弃对底层的一些控制。

最明显的例子当然是内存管理了。JVM以可插拔垃圾收集子系统的形式提供自动内存管理,所以程序员不必手动跟踪内存。

⚽️1. Java做为实验科学的性能

和大多数现代软件系统一样, Java/JVM 软件栈非常复杂。事实上,因为 JVM 具有高度优化和自适应的特性,所以构建于 JVM 之上的生产系统有时会表现出一些非常微妙且复杂的性能行为。这种复杂性和摩尔定律以及该定律所表示的硬件能力的空前增长有关。

计算机软件产业最为惊人的成就是其持续不断地抵消了硬件产业所取得的稳定而

巨大的成果。——Henry Petroski

尽管有些软件系统浪费了硬件产业过去的成果,但是 JVM 所代表的是某种工程上的胜利。从 20 世纪 90 年代末诞生以来, JVM 已经发展为一个高性能的、通用的执行环境,能够很好地利用新的硬件特性。但是,与任何复杂的高性能系统一样, JVM 需要我们有相当程度的技能和经验才能从中获得最大的收益。

如果不能清晰地定义测量,那比无效还要糟糕。——Eli Goldratt

因此, JVM 性能调优是技术、方法论、可测的量和工具的综合。它的目的是以系统所有者或用户所期望的方式产生可以测量的输出。换句话说,性能是一门实验科学,它通过以下方式实现预期结果:

  • 定义期望的结果
  • 测量现有系统
  • 确定要实现需求所需的工作
  • 开始某个改进操作
  • 重新测试
  • 确定目标是否实现

定义和确定预期性能结果的过程创建了一组量化的目标。确定应该测量什么并记录这些目标非常重要,而它们将成为项目工件和可交付成果的一部分。由此我们可以看到,性能分析是建立在定义和实现非功能性需求的基础之上的。

正如前面提到的,这个过程可不是占卜。相反,我们依赖于统计数据和对结果的适当处理。对于很多实际的项目而言,无疑需要对数据和统计有更深入的理解。

⚽️2. Java性能分类方法

接下来介绍一些基本的性能指标,它们为性能分析提供了一个词汇表,让你可以量化调优项目的目标。这些目标就是定义性能目标的非功能性需求。一些基本的性能指标如下:

  • 吞吐量(throughput)
  • 延迟(latency)
  • 容量(capacity)
  • 利用率(utilization)
  • 效率(efficiency)
  • 可扩展性(scalability)
  • 降级(degradation)

下面将依次简要地探讨这些指标。注意,对大部分性能项目而言,并非要同时优化每个指标。在每次性能迭代中只改进几个指标的情况更为常见,而且一次可以调优的指标可能也就这么多。在实际项目中,很可能会出现这样的情况:优化一个指标可能会损害另外一个或几个指标。

⚾️2.1. 吞吐量

吞吐量是一个表示系统或子系统能够执行的工作速率的指标,通常用某个时间段内的工作单元数来表示。比如,我们可能会对系统每秒能执行多少个事务感兴趣。

要使吞吐量数字在实际的性能实践中具有意义,那它应该包括对获得该数据的参考平台的描述。比如,硬件规格、操作系统和软件栈都与吞吐量有关;被测试的系统是单台服务器还是集群也是如此。此外,不同测试之间的事务数(或工作单元)应该是相同的。基本上,我们应该设法确保进行吞吐量测试的工作负载在多次运行之间保持一致。

⚾️2.2. 延迟

有时可以把性能指标比喻为水管,以此来解释它。如果一根水管每秒能流出 100 升水,那么 1 秒内流出的水量(100 升)就是吞吐量。在这个比喻中,延迟实际上就是水管的长度。

也就是说,它是处理一个事务并在水管的另一端看到结果所花费的时间。

它通常被称为端到端的时间。

⚾️2.3. 容量

容量是指系统所拥有的工作并行度,即系统中可以同时进行的工作单元(比如事务)的数量。

容量显然与吞吐量有关,而且我们应该可以预料到,随着系统上并发负载的增加,吞吐量(和延迟)会受到影响。因此,容量通常被看作在给定的延迟或吞吐量值下可用的处理能力。

⚾️2.4. 利用率

最常见的性能分析任务之一就是实现系统资源的高效利用。理想情况下, CPU 应该用于处理各个工作单元,而不是闲置(或者花时间处理操作系统或其他管理任务)。

根据工作负载的不同,不同资源的利用水平可能差异巨大。比如,在计算密集型的工作负载(如图形处理或加密)运行的时候, CPU 利用率可能接近 100%,但只使用了一小部分可用内存。

⚾️2.5. 效率

将系统的吞吐量除以所使用的资源可以衡量系统的整体效率。直观上看,这是有道理的,因为要获得同样的吞吐量,需要更多资源的那个系统可以被定义为效率低下。

在处理较大的系统时,也可以使用成本核算的形式来衡量效率。如果用美元计算,解决方案 A 的总体拥有成本(TCO)是解决方案 B 的两倍,那么在相同的吞吐量下, A 的效率显然是 B 的一半。

⚾️2.6. 可扩展性

系统的吞吐量或容量取决于可用于处理的资源。添加资源时,吞吐量的变化是衡量系统或应用程序可扩展性的一个标准。系统可扩展性的最理想情况是,吞吐量的变化和资源的变化步调一致。

考虑一个基于服务器集群的系统。如果集群被扩大,比如说规模扩大了一倍,那么可以实现什么样的吞吐量呢?如果新的集群可以处理两倍的事务量,那么该系统将呈现“完美的线性扩展”。这在实践中很难实现,特别是在面对各种可能的负载时。

系统的可扩展性取决于很多因素,而且通常不是一个简单的恒定因素。常见的情况是,对于某个范围内的资源,系统的可扩展性接近于线性,但在更高的负载下,系统会遇到一些阻碍完美扩展的限制。

⚾️2.7. 降级

如果我们通过增加请求(或客户端)的数量或加快请求到达的速度来增加系统的负载,可能会看到观察到的延迟或吞吐量的变化。

请注意,这种变化取决于系统的利用率。如果系统利用率不足,那么在出现可观测到的变化之前,系统应该比较平缓;但如果资源已经被充分利用,那么我们会看到吞吐量停止增加或延迟增加。这些变化通常被称为系统在额外负载下的降级。

👋小结

本文粗略介绍了Java性能是什么,不是什么;然后介绍了一个好的性能实践将用到的基本词汇。方便大家学习和参考。

👬 交友小贴士:

博主GithubGitee同名账号,Follow 一下就可以一起愉快的玩耍了,更多精彩文章请持续关注。

目录
相关文章
|
缓存 算法 Java
Java 实现的局域网管控软件的性能调优
局域网管控软件在企业网络管理中至关重要,但随着网络规模扩大和功能需求增加,其性能可能受影响。文章分析了数据处理效率低下、网络通信延迟和资源占用过高等性能瓶颈,并提出了使用缓存、优化算法、NIO库及合理管理线程池等调优措施,最终通过性能测试验证了优化效果,显著提升了软件性能。
134 1
|
1月前
|
Java 测试技术 API
Java Stream API:被低估的性能陷阱与优化技巧
Java Stream API:被低估的性能陷阱与优化技巧
270 114
|
3月前
|
机器学习/深度学习 Java 编译器
解锁硬件潜能:Java向量化计算,性能飙升W倍!
编译优化中的机器相关优化主要包括指令选择、寄存器分配、窥孔优化等,发生在编译后端,需考虑目标平台的指令集、寄存器、SIMD支持等硬件特性。向量化计算利用SIMD技术,实现数据级并行,大幅提升性能,尤其适用于图像处理、机器学习等领域。Java通过自动向量化和显式向量API(JDK 22标准)支持该技术。
154 4
|
3月前
|
Cloud Native 前端开发 Java
WebAssembly 与 Java 结合的跨语言协作方案及性能提升策略研究
本文深入探讨了WebAssembly与Java的结合方式,介绍了编译Java为Wasm模块、在Java中运行Wasm、云原生集成等技术方案,并通过金融分析系统的应用实例展示了其高性能、低延迟、跨平台等优势。结合TeaVM、JWebAssembly、GraalVM、Wasmer Java等工具,帮助开发者提升应用性能与开发效率,适用于Web前端、服务器端及边缘计算等场景。
128 0
|
6月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
1月前
|
存储 缓存 Java
Java 12相比Java 11有哪些性能上的提升?
Java 12相比Java 11有哪些性能上的提升?
57 3
|
1月前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
111 8
|
2月前
|
Java Spring
如何优化Java异步任务的性能?
本文介绍了Java中四种异步任务实现方式:基础Thread、线程池、CompletableFuture及虚拟线程。涵盖多场景代码示例,展示从简单异步到复杂流程编排的演进,适用于不同版本与业务需求,助你掌握高效并发编程实践。(239字)
203 6
|
2月前
|
缓存 Java 开发者
Java 开发者必看!ArrayList 和 LinkedList 的性能厮杀:选错一次,代码慢成蜗牛
本文深入解析了 Java 中 ArrayList 和 LinkedList 的性能差异,揭示了它们在不同操作下的表现。通过对比随机访问、插入、删除等操作的效率,指出 ArrayList 在多数场景下更高效,而 LinkedList 仅在特定情况下表现优异。文章强调选择合适容器对程序性能的重要性,并提供了实用的选择法则。
157 3
|
4月前
|
Java 应用服务中间件 Docker
java-web部署模式概述
本文总结了现代 Web 开发中 Spring Boot HTTP 接口服务的常见部署模式,包括 Servlet 与 Reactive 模型、内置与外置容器、物理机 / 容器 / 云环境部署及单体与微服务架构,帮助开发者根据实际场景选择合适的方案。
169 25