如何提高Java程序性能的技巧
Java
语言已有二十多年的历史。由于Java
使用Java虚拟机JVM
和垃圾回收机制,与其他当代语言相比,它最初的性能较慢。不过随着版本的迭代更新,其速度有所提高,JVM
的性能已大大优化。
尽管Java
和JVM
的执行速度已经加快,但您仍可以利用某些关键策略来进一步提高用Java开发的应用程序的性能。本教程深入探讨了Java
代码的一些优化技巧,并在适当的地方提供了代码示例。
避免编写长方法
提高 Java 性能的最简单方法之一就是避免编写长方法。如果编写长方法,Java 虚拟机将花费更多时间来执行。JVM
是Java
运行时环境 (JRE) 的一部分,它调用程序中的主方法。JVM 是 Java Virtual Machine(Java 虚拟机)的缩写,负责提供执行 Java 程序的环境,使 Java 应用程序可以在任何操作系统或机器上运行。
如果应用程序中的方法小而简洁,就不会降低应用程序的运行速度。这是因为保持方法简短可以最大限度地减少需要执行的处理量,同时还能减少 CPU 周期。此外,如果方法较多,程序员可以在适当的逻辑点将其拆分为多个方法,以优化处理速度。
即时 (JIT) 编译器会根据以前在解释器模式下的执行情况,确定将方法编译为本地代码所需的优化。这样可以提高性能和代码效率。
如果您的方法篇幅较长,JVM
将不会对其进行JIT
编译;此类方法也不太可能被内联。相反,如果方法较短,则非常适合JVM
内联和JIT
编译。
避免使用 BigDecimal 类
虽然BigDecimal
类对特定场景很有帮助,但它可能会妨碍应用程序的性能。Java开发人员执行的 BigDecimal
计算越多,应用程序的运行速度就越慢。虽然BigDecimal
类能保证小数和浮点数的精确度,但如果使用频率过高,应用程序的性能就会明显下降。如果您不需要该类提供的精度,最好跳过BigDecimal
而使用long
或double
数据类型。
尽可能使用原始类型
您还可以在应用程序中使用基元类型,以减少处理开销并提高性能。最好使用int
而不是Integer
,或者使用double
而不是Double
。原始类型存储在堆栈中,而类的实例(即对象)则存储在垃圾回收堆中。使用原始类型可以让JVM
将对象存储在堆栈而不是堆中。使用这种方法可以大大提高应用程序的性能,因为栈比堆更快,资源开销更少。
避免在 Java 代码中使用正则表达式
正则表达式(Regex)功能强大,价格低廉,使用简单。不过,如果必须在计算密集型代码中使用正则表达式,建议缓存模式引用,而不是每次都编译它。
执行剖析和负载测试
剖析Java
应用程序将揭示潜在的痛点和瓶颈。确定需要改进的地方是提高 Java 应用程序性能的第一步。如果不了解最主要的困难在哪里,就试图加快应用程序的运行速度,无异于蒙着眼睛向镖盘投掷飞镖。
使用存储过程而不是查询
提高Java
性能的最有效方法之一是使用存储过程而不是查询。当您想从数据库中的一个表或一组表中检索数据时,通常会使用查询,但查询可能会很昂贵,因为它们需要应用程序和数据库服务器进行大量处理。另一方面,存储过程预先编译为机器代码,只需编译一次,因此执行速度比查询快得多。
使用PreparedStatement代替Statement
使用预处理语句可以减少执行 SQL 语句所需的往返次数,从而提高应用程序的性能。由于 PreparedStatement 对象只需构建一次并执行多次,因此在运行参数化查询时,它比 Statement 对象更具优势。另一方面,Statement 对象在每次调用时都要编译和执行。此外,PreparedStatement 对象还能防止 SQL 注入威胁。
只选择查询中需要的列
从数据库检索数据时,我们要执行选择查询。不得选择非必要的列。换句话说,只应指定所需的列。选择过多的列会增加从数据库到应用程序的网络流量,影响应用程序的性能。
应用程序中使用缓存
缓存是一种通过将请求的数据保存在内存中以便日后重用来提高网络应用速度的方法。缓存是一种在两次请求之间将数据(可以是 servlet、命令、JSP 或应用程序数据)保存在内存中的方法,这样以后对相同数据或页面的请求就可以从内存中获取。正确使用缓存可以减少延迟、避免网络拥塞、提高内容可用性并减少内存和 CPU 周期的消耗。
它可以更快地渲染页面,减少服务器资源,从而提高应用程序的性能。您可以使用缓存创建可扩展的高性能应用程序。Java对象缓存通过维护获取或构建成本较高的对象的本地副本来提高服务器性能。对于可缓存的项目类型或对象的原始来源没有任何限制。
使用StringBuilder
开发人员在其应用程序中经常需要使用字符串连接,但字符串连接的成本很高。如果需要在应用程序中进行字符串连接,就必须避免使用字符串和 + 运算符。相反,如果利用 StringBuilder 来防止在执行字符串连接时创建多个字符串对象,则会有所帮助。如果不需要过多的字符串连接,可以使用 String 类的 concat 方法,而不用StringBuilder
作为替代。
其它技巧
您还可以通过以下方法提高性能:设置初始Java
堆大小、避免递归、晚获取早释放资源(如数据库连接)、修复低效代码、优化垃圾回收例程、使用更快的数据库查询和存储过程、选择正确的GC算法(串行 GC、并行 GC 等)、选择正确的 GC、重构代码或使用应用程序性能监控工具分析代码。
其它建议
您可以利用负载测试工具和应用程序性能管理 (APM) 解决方案来衡量和提高 Java 应用程序的性能。针对不同的应用场景运行负载测试至关重要,同时您还应监控 CPU、IO 和堆内存。
本文章翻译于improve-java-performance