Java性能调优的11个小技巧

无论使用哪种编程语言或平台,编写性能良好的应用程序都不简单,Java也不例外。

举个简单的例子,java垃圾收集就是一把双刃剑,没有完全的失败,也不表示必须只有专家才能去做。遵循几个易用的建议和最佳实践就帮助创建性能良好的应用程序。

不要过早优化

过早的优化是万恶之源,这可能是最重要的性能调优技巧之一。应遵循常见的最佳做法,尝试有效地实施用例。

过早的优化会占用大量时间,导致代码难以阅读和维护。

如何证明需要优化

首先,要定义期望的数值,如:指定API调用的最大响应时间。

然后,通过测试衡量应用程序的问题部分然后进行改进。完成之后,再看第二个技巧。

查找到真正的瓶颈

一般以通过两种方式开始:

1、看一下代码,从看起来可疑的部分开始,或者在可能会造成问题的地方开始。

2、使用探测工具获取有关代码各部分的行为和性能的详细信息。

创建性能测试套件

这是一个通用技巧,能帮助避免在性能改进中引发的其他问题。

始终定义一个性能测试套件,测试整个应用程序,并在进行性能改进之前和之后运行它。

这些测试能帮助确定所做的修改是否有效还是产生了副作用,确保不会发生弊大于利的优化。

对于优化涉及到多个不同部分的组件(如数据库或缓存)时,这一点尤为重要。

先解决最大的瓶颈

创建测试套件并使用事件探测器分析应用程序之后,会获得一些问题列表,此时可以专注于能够快速解决的问题,或者从能获得重大性能提升的问题开始。

使用StringBuilder

当向StringBuilder添加字符时,JVM将动态增加StringBuilder的大小。可以通过数字构造方法定义容量,由于不需要动态扩展,效率会更好。

使用+号连接字符串

如果只是将String分成多行以提高代码的可读性,直接使用+号进行连接,Java编译器会对此进行优化,并在编译时执行串联,在运行时,代码仅有1个String,不需要动态连接。

尽可能使用原语

避免开销并提高应用程序性能的另一种直接有效的方法是使用基本类型而不是包装类。

使用int而不是Integer,使用double而不是Double。JVM来的值存储在堆栈,而不是堆中,以减少内存消耗和更有效的整体处理。

避免使用BigInteger和BigDecimal

与long或double相比,BigInteger和BigDecimal需要更多的内存,从而大大降低了计算速度。

如果需要更高的精度,或者数字会超出long的范围,则最好三思。

这可能是唯一需要解决的性能问题,尤其是在实现数学算法时。

检查日志级别

log.debug(String.format(“User [%s] called method X with [%d]”, userName, i));
if (log.isDebugEnabled()) {
log.debug(“User [” + userName + “] called method X with [” + i + “]”);
}

StringUtils.replace代替String.replace

String.replace方法在Java 9之后效率非常高,在此之前可以使用Apache Commons StringUtils.replace。

缓存昂贵的资源

缓存是一种流行的解决方案,能避免重复执行昂贵或经常使用的代码片段。

思路也很简单:重复使用这些资源要比一次又一次地创建新资源更有优势。

典型的例子是在数据库连接池,Integer类的valueOf方法缓存-128到127之间的值。

如果条件允许使用最新版本的jdk通常能获取更好的性能。