ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码

编写高性能 Java 代码的最佳实践(3/4)

来源:网络整理     时间:2018-08-14     关键词:

本篇文章主要介绍了" 编写高性能 Java 代码的最佳实践",主要涉及到方面的内容,对于Javajrs看球网直播吧_低调看直播体育app软件下载_低调看体育直播感兴趣的同学可以参考一下: 摘要:本文首先介绍了负载测试、基于APM工具的应用程序和服务器监控,随后介绍了编写高性能Java代码的一些最佳实践。最后研究了JVM特定的调优技巧、数据库端的优...

private int factorial(int n, int accum) {
    if (n == 0) {
        return accum;
    } else {
        return factorial(n - 1, accum * n);
    }
}
public int factorial(int n) {
    return factorial(n, 1);
}

其他JVM语言(如Scala)已经在编译器级支持尾递归代码的优化,当然,对于这种优化目前也存在着一些争议。

谨慎使用正则表达式

正则表达式在很多场景中都非常有用,但它们往往具有非常高的性能成本。了解各种使用正则表达式的JDK字符串方法很重要,例如String.replaceAll()String.split()

如果你不得不在计算密集的代码段中使用正则表达式,那么需要缓存Pattern的引用而避免重复编译:

static final Pattern HEAVY_REGEX = Pattern.compile("(((X)*Y)*Z)*");

使用一些流行的库,比如Apache Commons Lang也是一个很好的选择,特别是在字符串的操作方面。

避免创建和销毁过多的线程

线程的创建和处置是JVM出现性能问题的常见原因,因为线程对象的创建和销毁相对较重。

如果应用程序使用了大量的线程,那么使用线程池会更加有用,因为线程池允许这些昂贵的对象被重用。

为此,Java的ExecutorService是线程池的基础,它提供了一个高级API来定义线程池的语义并与之进行交互。

Java 7中的Fork/Join框架也值得提一下,因为它提供了一些工具来尝试使用所有可用的处理器核心以帮助加速并行处理。为了提高并行执行效率,框架使用了一个名为ForkJoinPool的线程池来管理工作线程。

JVM调优

堆大小的调优

为生产系统确定合适的JVM堆大小并不是一件简单的事情。要做的第一步是回答以下问题以预测内存需求:

  1. 计划要把多少个不同的应用程序部署到单个JVM进程中,例如EAR文件、WAR文件、jar文件的数量是多少?
  2. 在运行时可能会加载多少个Java类,包括第三方API的类?
  3. 估计内存缓存所需的空间,例如,由应用程序(和第三方API)加载的内部缓存数据结构,比如从数据库缓存的数据、从文件中读取的数据等等。
  4. 估计应用程序将创建的线程数。

如果没有经过真实场景的测试,这些数字很难估计。

要获得有关应用程序需求的最好最可靠的方法是对应用程序执行实际的负载测试,并在运行时跟踪性能指标。我们之前讨论的基于Gatling的测试就是一个很好的方法。

选择合适的垃圾收集器

Stop-the-world(STW)垃圾收集的周期是影响大多数面向客户端应用程序响应和整体Java性能的大问题。但是,目前的垃圾收集器大多解决了这个问题,并且通过适当的优化和大小的调整,能够消除对收集周期的感知。

分析器、堆转储和详细的GC日志记录工具对此有一定的帮助作用。再一次注意,这些都需要在真实场景的负载模式下进行监控。

有关不同垃圾收集器的更多信息,请查看这个指南。

JDBC性能

关系型数据库是Java应用程序中另一个常见的性能问题。为了获得完整请求的响应时间,我们很自然地必须查看应用程序的每一层,并思考如何让代码与底层SQL DB进行交互。

连接池

让我们从众所周知的事实开始,即数据库连接是昂贵的。 连接池机制是解决这个问题非常重要的第一步。

这里建议使用HikariCP JDBC,这是一个非常轻量级(大约130Kb)并且速度极快的JDBC连接池框架。

JDBC批处理

持久化处理应尽可能地执行批量操作。 JDBC批处理允许我们在单次数据库交互中发送多个SQL语句。

这样,无论是在驱动端还是在数据库端,性能都可能得到显着地提升。 * PreparedStatement*是一个非常棒的的批处理命令,一些数据库系统(例如Oracle)只支持预处理语句的批处理。

另一方面,Hibernate则更加灵活,它允许我们只需修改一个配置即可快速切换为批处理操作。

语句缓存

语句缓存是另一种提高持久层性能的方法,这是一种鲜为人知但又容易掌握的性能优化方法。

相关图片

相关文章