5个优秀的 Java 性能优化技巧

8 位读者喜欢这篇文章。
Javascript code close-up with neon graphic overlay

Photo by Jen Wike Huger

优化你的 Java 代码需要理解 Java 中不同元素如何交互,以及它如何与运行它的操作系统交互。 使用这五个技巧和资源开始学习如何分析和优化你的代码。

在我们开始介绍干货之前,您可能会担心许可问题。 Java 归 Oracle 所有,并受 Oracle 的 BCL 许可协议的约束,该许可协议不是免费/开源许可协议。 尽管如此,Oracle Java 仍然是许多开源项目的一部分。 OpenJDK 是 Java 平台的免费软件实现,采用 GPL v2 许可。(有关更多信息,请参阅 Wikipedia 上的Free Java implementations。)

开始

性能优化取决于多种因素,包括垃圾回收、虚拟机和底层操作系统 (OS) 设置。 开发人员可以使用多种工具进行分析和优化,您可以通过阅读Java Tools for Source Code Optimization and Analysis来了解其中的一些工具。 如果您在术语和 Java 基础知识方面遇到困难,请查看 Livecoding Java 类别页面,其中包含直播、存档视频和其他有用的信息。

Java Programming Category Page

“视情况而定”

有必要了解,没有两个应用程序可以具有相同的优化,并且没有绝对能优化 Java 应用程序的方法。 关键在于使用最佳实践并坚持正确的性能优化方法。 要真正掌握性能优化,作为 Java 开发人员,您需要对 Java 虚拟机 (JVM) 和底层操作系统有正确的理解。

  • JVM 和底层操作系统: Java 虚拟机是任何 Java 应用程序的所在地。 阅读 JVM 内部结构指南,了解更多关于 JVM 内部结构和操作系统差异的信息。
  • JVM 分布式模型: Java 分布式模型处理应用程序的多个 JVM 实例。 分布式模型通过获取更多资源来提高应用程序性能。 您可以采用两种方法。 第一种方法是在单个服务器上运行多个 JVM,堆大小为 2GB 或 8GB。 第二种方法是在多个服务器上运行一个 JVM。 选择正确的方法取决于多种因素,包括可用性和响应能力。
  • JVM 架构: 选择正确的 JVM 架构对于性能至关重要。 您可以选择 64 位 JVM 机器或 32 位 JVM 机器。 通常,32 位 JVM 的性能优于其 64 位 JVM。 只有当您需要大于 3GB 的堆大小时,才应选择 64 位 JVM。

在对性能优化及其要素的基本概念有了清晰的了解后,我们现在将重点介绍有助于优化 Java 应用程序的技巧。

1. 调整垃圾回收 (GC)

由于垃圾回收的复杂性,很难找到应用程序的确切性能。 但是,如果您真的想优化应用程序,则需要相应地处理垃圾回收。 一般规则是更改 GC 设置并同时执行分析。

对结果感到满意后,您可以停止该过程并转向其他形式的优化。 确保除了平均事务时间之外,还要注意异常值。 当涉及到 Java 应用程序减速时,异常值才是真正的罪魁祸首,并且很难找到。

此外,您需要了解应用程序运行时性能下降的影响。 每周一次的减速可以忽略不计,而每次数据库事务的减速可能是一件代价高昂的事情。 相应地选择你的优化路径,并根据工作负载优化应用程序。

2. 获取正确的 GC 算法以供使用

让我们更深入地了解 GC 优化。 毕竟,它是整个优化问题的核心。 目前,有四种 Java 垃圾收集器算法可供选择。 每种算法都满足不同的需求,因此您需要相应地进行选择。 许多开发人员未能优化他们的应用程序,因为他们对 GC 算法一无所知。

这四种算法是 Serial Collector、Parallel/Throughput collector、CMS collector 和 G1 collector。 要了解有关每种垃圾收集器及其工作原理的更多信息,请查看 Takipi 博客中精彩的垃圾收集器 — Serial vs. Parallel vs. CMS vs. G1。 该文章还讨论了 Java 8 对 GC 算法和其他细微变化的影响。

回到 GC 算法,根据Understanding Java Garbage Collection,并发标记 & 清扫 GC(或 “CMS”)算法是 Web 服务器应用程序的最佳算法选择。 Parallel GC 算法非常适合具有内置可预测性的应用程序。

G1 和 CMS 非常适合并发操作,但也会导致频繁的暂停。 选择还取决于权衡。 例如,即使并行算法与其他 GC 算法相比具有更长的 GC 暂停时间,选择并行算法也是一个好主意。

3. Java 堆

Java 内存堆在满足内存需求方面起着至关重要的作用。 最好始终从最小堆分配开始,然后通过持续测试来增加它。 大多数情况下,优化问题可以通过增加堆大小来解决,但如果 GC 开销很大,则该解决方案不起作用。

GC 开销也会使吞吐量过低,从而使应用程序慢得令人不快。 此外,尽早调整 GC 可以帮助你避免堆大小分配问题。 要开始,你可以选择 1GB 到 8GB 的任何堆大小。 在选择正确的堆大小时,还会涉及到老年代和新生代对象的概念。

最后,堆大小应取决于老年代与新生代对象的比率、之前的 GC 优化以及 liveset(即对象的内存大小)。

4. 核心应用优化

核心代码优化是优化 Java 应用程序的最佳方式。 如果你的应用程序对 GC 和堆优化没有响应,最好进行架构更改并专注于应用程序如何处理信息。 使用巧妙的算法并注意对象可以解决许多问题,包括碎片、堆问题和垃圾回收问题。

5. 使用最优函数

Java 有多个函数来处理算法性能。 如果你使用 StringBuilder 代替简单的 String,你将在性能方面获得一些改进。 但是,还有其他方法可以在代码级别处理优化。 让我们看看下面的内容。

  • 使用 StringBuilder 代替 + 运算符。
  • 避免使用 iterator()。
  • 充分利用堆栈。
  • 避免正则表达式,而应使用 Apache Commons Lang
  • 远离递归。 递归非常消耗资源!

阅读更多关于 Java 代码优化的信息,请参考 Java 中 10 大简单性能优化.

结论

Java 性能优化是一个很大的课题,本文显然没有涵盖所有内容。 如果你认为需要向文章添加一些内容,请不要忘记通过在下面评论与观众分享。

标签
Michael Livecoding.tv
Michael 博士是总部位于洛杉矶的 Education Ecosystem 的创始人兼首席执行官。 公司(前身为 Livecoding.tv)。 Education Ecosystem (LEDU) 是一个基于项目的学习平台,它教学生如何构建编程、游戏开发、人工智能、网络安全、数据科学和区块链等领域的真实产品。

1 条评论

这是一个小问题,但你可能考虑将你的引导图片更改为引用 Java... 而不是 JavaScript... 或其他通用图片。

Creative Commons License本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
© . All rights reserved.