澳门新浦京8455comJava最伟大的价值

澳门新浦京8455com 2

本文由码农网 –
小峰原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划!

澳门新浦京8455com 1

为了收集现在对Java生态系统的见解,《DZone’s Java Ecosystem research
guide》将在9月份发表,我们将和熟悉Java生态系统的15个高管对话。

企业的IT运维人员喜爱Red Hat Enterprise Linux (RHEL)
,因为系统很稳定且高支持,而开发者想要最新和最棒的编程工作。为了帮助解决这个,红帽公司
对这个两难问题的解决方法就是用最新的稳定版Red Hat Enterprise Linux
(RHEL)去测试这些新品牌工具,然后向开发者发布。本周五,红帽公司发布了最新的一批针对开发者/程序员的一些列新工具:Red
Hat Developer Toolset 3.1正式版和 Red Hat Software Collections 2
测试版,一个开源的Web开发者工具、语言和数据库集。所有提供自RHEL的工具或软件的生命周期已经缩短,走上了频繁更新的道路。红帽开发者工具套件Developer
Toolset 3.1的特性包括:GNUCompiler Collection (GCC) 4.9.2:
最新的GCC上游稳定版本,提供多处改进和bug修复;Eclipse 4.4.2: 支持Java 8
以及更新的Eclipse CDT(8.6)版本,Eclipse Linux Tools (3.2), Eclipse Mylyn
(3.14.2), 和 Eclipse Egit/Jgit (3.6.1);众多其它的更新包,包括 GDB
7.8.2, elfutils 0.161, memstomp 0.1.5, SystemTap 2.6, Valgrind 3.10.1,
Dyninst 8.2.1, 以及 ltrace 0.7.91。用这些开发工具,你可以给RHEL 6 和 7.x
开发应用程序。这些应用程序可以在RHEL上运行,不管是物理机,虚拟机还是云环境。它们也可以在红帽提供的Platform-as-a-Service
(PaaS)服务OpenShift上运行。这些新的开发者程序集包括可以运行在AMD64 和
Intel 64 架构上RHEL
7的包。尽管这些工具都是64位的,你也可以用它们创建或者修改32位的二进制文件。在运行任何这些程序之前,你应该安装RHEL所有最近的更新。要安装这个测试工具集,你的系统需要订阅“可选渠道”来获取所有红帽开发者工具集需要的工具链包。另外,如果已经安装了早期版本的工具集,可能会遇到安装Toolkit
3.1
时的一些问题。尽管这些问题很容易解决,在安装新的工具集之前还是应该大概看一下这些可能出现的问题。在Red
Hat Software Collections 2 测试版中你会发现这些特性:Python
3.4:最新稳定的Python
3主要发行版本,以及一些额外实用的工具和MySQL数据库连接器;PHP
5.6:拥有多项改进、迁移和升级路径的变化;Perl 5.20:
Perl最新的稳定版有一些额外的使用程序、脚本,以及MySQL 和
PostgreSQL数据库连接器;Ruby 2.2和它自己的工具集:Rails
4.1让用户可访问安装、更新Ruby,却不一定要安装Rails的一个更新;MySQL5.6:增强了InnoDB的高事务吞吐量,查询、管理Database
Tables的分开改进,以及更好的性能检测;MariaDB
10:无缝地MySQL替换;PostgreSQL 9.4:增加了新的JSONB
数据类型,增加Logical
Decoding的扩展性,添加新的主从复制工具,比如Bi-Directonal
Replication,以及几个额外功能的性能改进;MongoDB
2.6:一个高性能、跨平台的文档数据库特性,全面改进核心服务器,增强高可扩展性;Passenger
4.0:针对Ruby的一个现代Web和应用服务器,Passenger
4.0优化了性能、内存使用和易于使用。在现有套件中,它还有许多更新和改进:Maven
3.0.5:在最新稳定版中,实现自动化构建一些Java项目;Python
2.7:现在包括了python-wheel, python-pip;Thermostat
1.2:基于事务分析,sampler profiler的改进,Maven archetypes 优化,Swing
客户端和图表在视觉上的高进;nginx
1.6:开源且高性能的HTTP服务器;DevAssistant
0.9.3:搭建开发环境、发布代码和实现其他相关任务的实用工具,最新稳定版带来了Bug修复和支持旧版本;Node.js
0.10.33:最新稳定版可完全支持现有的编程平台。此外,Red Hat Software
Collections 2
测试版现在可支持多个相同语言版。所以,这个软件套件包含了新的Python
2.7封装,也会继续支持Python 3.3和Python
3.4。另外,并不是所有程序员都能可作为Dockerfiles。与此同时,两个程序员包的更新将会获得至少两年的支持。RHEL
开发者赶紧去下载并运用起来吧!了解更多:Red Hat Developer ToolsetRed Hat
Developer Toolset 3.1 Now AvailableRed Hat Software Collections

原文: How to Improve the Performance of a Java
Application

下面就是我们要对话的贵客:

作者:Eugen Paraschiv

Joel Depernet, E.V.P. Global Research and
Development, Axway公司

Sacha Labourey,
CEO和创始人, CloudBees公司

Rick Reich, CEO, Development
Heroes公司

Asad Ali, Principal Software
Developer, Dynatrace公司

Lisa Hamaker, 市场经理, Dynatrace公司

David Park, 产品副总裁, HackerRank公司

Charles Kendrick, 创始人和CTO, Isomorphic
Software公司

Wayne Citrin, CTO, JNBridge公司

Raymond Augé, 高级软件架构师, Liferay公司

Laura Kassovic, 创始人, MbientLab公司

Cameron Wilby, 联合创始人, Origin Code
Academy公司

James Faulkner, Technology Evangelist, Red
Hat公司

Paul Trowe, CEO, Replay Games公司

Calvin French-Owen,
CTO和联合创始人, Segment公司

翻译:雁惊寒

澳门新浦京8455com 2

摘要:本文首先介绍了负载测试、基于APM工具的应用程序和服务器监控,随后介绍了编写高性能Java代码的一些最佳实践。最后研究了JVM特定的调优技巧、数据库端的优化和架构方面的调整。以下是译文。

我们问受访者,“现实世界中什么的问题是被Java解决的——我们可以看到的最伟大的价值在哪里”,他们告诉我们:

澳门新浦京8455com 3

1)Java内存分析,我们用它来查看哪里正在发生内存泄漏。较新的异步框架,使用Java代码工作,从线程跳转到线程。从一个线程被传递到另一个线程的请求。我们跨越线程边界将信息联合在一起。APM工具遵循跨线程的请求,以知道组件是否运行缓慢。我们提供终端到终端的事务细节。当查看损坏的数据时,很难说明这是一个还是多个请求。确定性能下降的真正原因是有必要的。2)数据库访问显示了很多,并且通过事务请求作出了很多数据库调用。你必须能够看到自由数据采集的空白以便于整体地看数据。这使得我们能够看到问题是否单独发生。3)在DevOps中,你需要能够在你检查代码的那一刻看到整个应用程序生命周期,以及开始构建的时候。通过嵌入前期,你可以捕捉可能会导致QA问题的代码模式,并且这些QA问题会损害收入和品牌。应用程序生命周期管理的关键是看到你发布到管道的东西。

介绍

代码的可移植性。每台设备都可以用相同的调用运行Java。如果你用C
++或其他面向对象语言构建东西,那么你必须得针对所要运行的每个平台进行调整。

在这篇文章中,我们将讨论几个有助于提升Java应用程序性能的方法。我们首先将介绍如何定义可度量的性能指标,然后看看有哪些工具可以用来度量和监控应用程序性能,以及确定性能瓶颈。

任何需要稳健性的地方——它的可扩展性,可工作于许多机器和许多不同的操作系统。它是开发者的通用语,并且有针对所有内容的库。这使得生活美好多了。它并不神奇,不能与其它语言相比。对于健壮性,可扩展性,和工作于许多操作系统的能力而言,选择要么是.NET要么是Java。

我们还将看到一些常见的Java代码优化方法以及最佳编码实践。最后,我们将看看用于提升Java应用程序性能的JVM调优技巧和架构调整。

有大量优秀的Java开发者,随时准备着支持Java语言。这可以最小化风险,并减少应用成本。而且还有大量的开源和免费的基础学习和体验信息。

请注意,性能优化是一个很宽泛的话题,而本文只是对JVM探索的一个起点。

企业软件开发。能够写原生的Android应用。

性能指标

消息——JMS也支持企业软件。使得各种组件之间的通讯可以有效工作,作出重要贡献。

在开始优化应用程序的性能之前,我们需要理解诸如可扩展性、性能、可用性等方面的非功能需求。

在企业的服务器端使用,特别是大规模的,涉及到多个服务或平台和分布式事务之间集成的面向数据库的系统。

以下是典型Web应用程序常用的一些性能指标:

Java语言的最大价值在于它的便携性和JVM。Java被设计为能够运行于所有的平台,不管字节排序,数据大小,CPU和OS如何。JVM是一个非常强大的系统,允许你在运行时做例如交换jar文件或代码块这样的事情。热交换代码的能力大大降低了调试应用程序所需的时间量。

  • 应用程序平均响应时间
  • 系统必须支持的平均并发用户数
  • 在负载高峰期间,预期的每秒请求数

用于我们正在Kafka和Hadoop中为了批处理而建设的数据管道。这些都是伟大的、新的Java使用案例。写在JVM上,因此更容易并且自带更好的支持和性能。Spark
in Python没有Java这样好。

这些指标可以通过使用多种监视工具监测到,它们对分析性能瓶颈和性能调优有着非常大的作用。

Java是世界上对于质量、可靠性,及时发布、工具链,以及生态系统多个方面的排行前三的语言之一。它是我能想到的,能够做到这一点的唯一语言。总体而言,它还是最强大和最全面的语言。

示例应用程序

开放源码库很多,但依然要选择合适的/最好的。你永远不需要重做基础知识。此外,不同于其他语言,市场上有大量的Java开发人员。

我们将使用一个简单的Spring Boot
Web应用程序作为示例,在 这篇文章 中有相关的介绍。这个应用程序可用于管理员工列表,并对外公开了添加和检索员工的REST
API。

我们看到它在医疗融资及旅游和交通运输等行业被大量使用。Twitter开始用Ruby
on Rails,但是后来也转移到Java,因为它更可扩展并且可有更多的程序员可用。

我们将使用这个程序作为参考来运行负载测试,并在接下来的章节中监控各种应用指标。

已经有20年解决问题经验的成熟平台。来自Red Hat和生态系统的专业知识。

找出性能瓶颈

最后,那么,你觉得Java最伟大的价值在哪里呢?

负载测试工具和应用程序性能管理(APM)解决方案常用于跟踪和优化Java应用程序的性能。要找出性能瓶颈,主要就是对各种应用场景进行负载测试,并同时使用APM工具对CPU、IO、堆的使用情况进行监控等等。

Gatling 是进行负载测试最好的工具之一,它提供了对HTTP协议的支持,是HTTP服务器负载测试的绝佳选择。

Stackify的 Retrace 是一个成熟的APM解决方案。它的功能很丰富,对确定应用程序的性能基线很有帮助。
Retrace的关键组件之一是它的 代码分析 功能,它能够在不减慢应用程序的情况下收集运行时信息。

Retrace还提供了监视基于JVM应用程序的内存、线程和类的小部件。除了应用程序本身的指标之外,它还支持监视托管应用程序的服务器的CPU和IO使用情况。

因此,像Retrace这样功能全面的监控工具是解锁应用程序性能潜力的第一步。而第二步则是在你的系统上重现真实使用场景和负载。

说起来容易,做起来难,而且了解应用程序当前的性能也非常重要。这就是我们接下来要关注的问题。

Gatling负载测试

Gatling的模拟测试脚本是用Scala编写的,但该工具还附带了一个非常有用的图形界面,可用于记录具体的场景,并生成Scala脚本。

在运行模拟脚本之后,Gatling会生成一份非常有用的、可用于分析的HTML报告。

定义场景

在启动记录器之前,我们需要定义一个场景,表示用户在浏览Web应用时发生的事情。

在我们的这个例子中,具体的场景将是“启动200个用户,每个用户发出一万个请求。”

配置记录器

根据“ Gatling的第一步 ”所述,用下面的代码创建一个名为EmployeeSimulation的scala文件:

class EmployeeSimulation extends Simulation {
    val scn = scenario("FetchEmployees").repeat(10000) {
        exec(
          http("GetEmployees-API")
            .get("http://localhost:8080/employees")
            .check(status.is(200))
        )
    }
    setUp(scn.users(200).ramp(100))
}

运行负载测试

要执行负载测试,请运行以下命令:

$GATLING_HOME/bin/gatling.sh-sbasic.EmployeeSimulation

对应用程序的API进行负载测试有助于发现及其细微的并且难以发现的错误,如数据库连接耗尽、高负载情况下的请求超时、因为内存泄漏而导致堆的高使用率等等。

监控应用程序

要使用Retrace进行Java应用程序的开发,首先需要在Stackify上申请 免费试用 账号。然后,将我们自己的 Spring
Boot 应用程序配置为Linux服务。我们还需要在托管应用程序的服务器上安装Retrace代理,按照 这篇文章 所述的操作即可。

Retrace代理和要监控的Java应用程序启动后,我们就可以到Retrace仪表板上单击AddApp按钮添加应用了。添加应用完成之后,Retrace将开始监控应用程序了。

找到最慢的那个点

Retrace会自动监控应用程序,并跟踪数十种常见框架及其依赖关系的使用情况,包括SQL、MongoDB、Redis、Elasticsearch等等。Retrace能帮助我们快速确定应用程序为什么会出现如下性能问题:

  • 某个SQL语句是否会拖慢系统的速度?
  • Redis突然变慢了吗?
  • 特定的HTTP Web服务宕了,还是变慢了?

例如,下面的图形展示了在一段给定的时间内速度最慢的组件。

澳门新浦京8455com 4

代码级别的优化

负载测试和应用程序监控对于确定应用程序的一些关键性能瓶颈非常有用。但同时,我们需要遵循良好的编码习惯,以避免在对应用程序进行监控的时候出现过多的性能问题。

在下一章节中,我们将来看一些最佳实践。

使用StringBuilder来连接字符串

字符串连接是一个非常常见的操作,也是一个低效率的操作。简单地说,使用+=来追加字符串的问题在于每次操作都会分配新的String。

下面这个例子是一个简化了的但却很典型的循环。前面使用了原始的连接方式,后面使用了构建器:

public String stringAppendLoop() {
    String s = "";
    for (int i = 0; i < 10000; i++) {
        if (s.length() > 0)
            s += ", ";
        s += "bar";
    }
    return s;
}

public String stringAppendBuilderLoop() {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < 10000; i++) {
        if (sb.length() > 0)
            sb.append(", ");
        sb.append("bar");
    }
    return sb.toString();
}

上面代码中使用的StringBuilder对性能的提升非常有效。请注意,现代的JVM会在编译或者运行时对字符串操作进行 优化 。

避免递归

导致出现StackOverFlowError错误的递归代码逻辑是Java应用程序中另一种常见的问题。如果无法去掉递归逻辑,那么尾递归作为替代方案将会更好。

我们来看一个头递归的例子:

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

现在我们把它重写为尾递归:

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堆大小并不是一件简单的事情。要做的第一步是回答以下问题以预测内存需求:

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

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

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

选择合适的垃圾收集器

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

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

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

JDBC性能

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

连接池

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

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

JDBC批处理

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

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

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

语句缓存

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

只要底层的JDBC驱动程序支持,你就可以在客户端(驱动程序)或数据库端(语法树甚至执行计划)中缓存PreparedStatement。

规模的缩放

数据库复制和分片 是提高吞吐量非常好的方法,我们应该充分利用这些经过实践检验的架构模式,以扩展企业应用的持久层。

架构改进 缓存

现在内存的价格很低,而且越来越低,从磁盘或通过网络来检索数据的性能代价仍然很高。缓存自然而然的变成了在应用程序性能方面不能忽视的关键。

当然,在应用的拓扑结构中引入一个独立的缓存系统确实会增加架构的复杂度,所以,应当充分利用当前使用的库和框架现有的缓存功能。

例如,大多数的持久化框架都支持缓存。 Spring
MVC等Web框架还可以使用Spring中内置的缓存支持,以及基于ETags的强大的HTTP级缓存。

横向扩展

无论我们在单个实例中准备了多少硬件,都会有不够用的时候。简而言之,扩展有着天生的局限性,当系统遇到这些问题时,横向扩展是处理更多负载的唯一途径。这一步肯定会相当的复杂,但却是扩展应用的唯一办法。

对大多数的现代框架和库来说,这方面还是支持得很好的,而且会变得越来越好。
Spring生态系统有一个完整的 项目集 ,专门用于解决这个特定的应用程序架构领域,其他大多数的框架也都有类似的支持。

除了能够提升Java的性能,通过集群进行横向扩展也有其他的好处,添加新的节点能产生冗余,并更好的处理故障,从而提高整个系统的可用性。

结论 在这篇文章中,我们围绕着提升Java应用的性能探讨了许多概念。我们首先介绍了负载测试、基于APM工具的应用程序和服务器监控,随后介绍了编写高性能Java代码的一些最佳实践。最后,我们研究了JVM特定的调优技巧、数据库端的优化和架构方面的调整。

【编辑推荐】

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图