美文网首页不屈的码农
Java应用程序性能优化的原理

Java应用程序性能优化的原理

作者: Java架构师CAT | 来源:发表于2019-07-08 19:11 被阅读2次

    在这篇文章中我将解释Java应用程序性能优化的原则。具体来说,我将解释优化Java应用程序性能所需的步骤,以及您需要执行的步骤,以确定您的应用程序是否需要调优。我还将解释在性能调优过程中可能遇到的问题。本文将以您需要遵循的建议完成,以便在优化Java应用程序时做出更好的决定。

    概述

    并不是每个应用程序都需要调优。如果应用程序的性能与预期的一样好,则不需要为提高其性能而付出额外的努力。然而,很难期望一个应用程序在完成调试后就能达到其目标性能。这是需要调优的时候。不管实现语言如何,优化应用程序都需要很高的专业知识和高度的注意力。另外,您可能不会使用相同的方法来调优某个应用程序来优化另一个应用程序。这是因为每个应用程序都有其独特的操作和不同类型的资源使用。因此,与编写应用程序所需的知识相比,优化应用程序需要更多的基本知识。例如,您需要有关虚拟机、操作系统和计算机体系结构的知识。当您基于这些知识专注于应用程序域时,您可以成功地优化应用程序。

    有时,Java应用程序优化只需要更改JVM选项,例如垃圾收集器,但有时需要更改应用程序源代码。无论选择哪种方法,都需要首先监视执行Java应用程序的过程。因此,本条将处理的问题如下:

    如何监视Java应用程序?我应该提供哪些JVM选项?我如何知道是否需要修改源代码?

    优化Java应用程序性能所需的知识

    Java应用程序在Java虚拟机(JVM)中运行。因此,要优化Java应用程序,需要了解JVM操作过程。我以前在博客上写过理解JVM内部在这里,您可以找到关于JVM的深刻见解。

    本文中有关JVM运行过程的知识主要是指垃圾收集(GC)和热点方面的知识。虽然您可能无法仅利用GC或Hotpot方面的知识来调优各种Java应用程序的性能,但这两个因素在大多数情况下都会影响Java应用程序的性能。

    值得注意的是,从操作系统的角度来看,JVM也是一个应用程序进程。要创建一个JVM运行良好的环境,您应该了解OS如何将资源分配给进程。这意味着,要优化Java应用程序的性能,您应该了解操作系统或硬件以及JVM本身。

    另一方面,Java语言领域的知识也很重要。理解锁或并发性以及熟悉类加载或对象创建也很重要。

    当您执行Java应用程序性能调优时,您应该通过集成所有这些知识来处理它。

    Java应用程序性能优化过程

    图1显示了由CharlieHunt和BinuJohn合著的“Java性能”一书中的流程图。这个图表显示了Java应用程序性能调优的过程。

    图1:优化Java应用程序性能的过程。

    上述过程不是一个一次性的过程.您可能需要重复它,直到调优完成为止。这也适用于确定预期的性能值。在调优过程中,有时您应该降低预期的性能值,有时会提高它。

    JVM分布模型

    A JVM分布模型与决定是在单个JVM上操作Java应用程序还是在多个JVM上操作Java应用程序有关。您可以根据它的可用性、响应性和可维护性来决定它。在多个服务器上运行JVM时,还可以决定是在单个服务器上运行多个JVM,还是每个服务器运行一个JVM。例如,对于每台服务器,您可以决定是使用8 GB的堆运行单个JVM,还是使用2GB的堆分别使用4个JVM。当然,您可以根据核心的数量和应用程序的特性来决定运行在单个服务器上的JVM的数量。在响应性方面比较这两种设置时,对于同一应用程序使用2GB的堆可能比使用8GB的堆更有利,因为当使用2GB的堆时,执行完整的垃圾回收所需的时间更短。但是,如果使用8 GB的堆,则可以减少全GC的频率。如果应用程序使用内部缓存,还可以通过提高命中率来提高响应能力。因此,您可以通过考虑应用程序的特点和克服您选择的模型的一些优点的方法来选择合适的分布模型。

    JVM体系结构

    选择JVM意味着是否使用32位JVM或者是64位JVM..在同样的情况下,您最好选择32位JVM。这是因为32位JVM的性能优于64位JVM。然而,32位JVM的最大逻辑堆大小是4GB。(然而,32位操作系统和64位操作系统的实际可分配大小都是2-3 GB。)当堆大小大于此时,使用64位JVM是合适的。

    表1:业绩比较(来源).

    下一步是运行应用程序并测量其性能。此过程包括调整GC、更改OS设置和修改代码。对于这些任务,可以使用系统监视工具或分析工具。

    应该指出,为响应性进行调优和为吞吐量进行优化可能是不同的方法。如果停止这个世界例如,尽管每个单位时间的吞吐量很大,但仍不时发生完整的垃圾回收。你也需要考虑一下,可能会发生交易。这种权衡不仅可能发生在响应性和吞吐量之间。您可能需要使用更多的CPU资源来减少内存使用,或者忍受响应性或吞吐量的降低。由于可能发生相反的情况,您需要根据优先级进行处理。

    流程图图1上面展示了几乎所有类型的Java应用程序(包括Swing应用程序)的性能调优方法。然而,这个图表有点不适合为Internet服务编写服务器应用程序,就像我们公司NHN所做的那样。流程图图2下面是一个简单的基于图1更适合NHN。

    图2:优化NHN的Java应用程序的推荐过程。

    选择JVM在上面的流程图中,意味着尽可能多地使用32位JVM,除非您需要使用64位JVM来维护几个GB的缓存。

    现在,根据图2,您将了解如何执行每个步骤。

    JVM选项

    我将解释如何主要为Web应用服务器指定合适的JVM选项。尽管并不适用于每一种情况,最佳GC算法,尤其是对于web服务器应用程序,并发标记扫描GC这是因为重要的是低延迟..当然,当同时使用马克扫描时,有时会发生一个很长的停-世界现象,因为分数。然而,这个问题很可能通过调整新的面积大小或比例来解决。

    指定新面积与指定全堆大小..您最好指定新区域大小与整个堆大小的比率。–XX:NewRatio控件指定所需的新区域大小。–XX:NewSize选择。指定一个新的区域大小很重要,因为大多数对象都不能存活很长时间。在web应用程序中,除缓存数据外,大多数对象都是在HttpResponse到HttpRequest是被创造出来的。这一次几乎不超过一秒钟。这意味着对象的寿命也不超过一秒钟。如果新区域大小不大,则应将其移动到旧区域,以便为新创建的对象腾出空间。旧区的GC费用远远大于新区的费用,因此,适当地设置新区的面积是很好的。

    但是,如果新的区域规模超过某一水平,则响应能力将降低。这是因为新区域的垃圾收集基本上是将数据从一个幸存者区域复制到另一个幸存者区域。此外,停止世界现象将发生,即使在执行GC为新的地区,以及旧的地区。如果新的区域变大,幸存者的面积将增加,因此要复制的数据的大小也会增加。鉴于这些特点,参考NewRatio热点JVM的操作系统。

    表2:按操作系统和选项分列的新比率。

    如果NewRatio是指定的,1/(NewRatio +1)整个堆大小变成新的区域大小。你会发现NewRatio的SPARC-服务器非常小。这是因为当指定默认值时,Sparc系统用于更多的高端用途。现在,使用x86服务器很常见,其性能也得到了改进。因此,最好指定2或3,这是类似于SPARC-服务器.

    您还可以指定NewSize和MaxNewSize而不是NewRatio..新区域的创建与指定的值相同。NewSize的大小与指定的值一样大。MaxNewSize..“伊甸园”或“幸存者区”也会根据(指定或默认)比率增加。指定相同大小的-Xs和-Xmx,指定相同大小的MaxSize和MaxNewSize.

    如果两者都指定了NewRatio和NewSize你应该用大一点的。因此,在创建堆时,可以将初始的New Area大小表示为:

    min(MaxNewSize, max(NewSize, heap/(NewRatio+1)))

    但是,在一次尝试中不可能确定适当的整个堆大小和新区域大小。根据我在NHN运行Web服务器应用程序的经验,我建议使用以下JVM选项运行Java应用程序。使用这些选项监视应用程序的性能之后,可以使用更合适的GC算法或选项。

    表3:建议的JVM选项。

    衡量应用程序的性能

    掌握应用程序执行情况所需的信息如下:

    租置计划(老年退休金计划):概念上理解应用程序性能所需的信息。每秒请求(RPS):严格地说,RPS不同于响应,但您可以将它理解为响应性。通过RPS,您可以检查用户查看结果所需的时间。RPS标准差:如果可能的话,甚至有必要诱导RPS。如果发生偏差,则需要检查GC调优或互操作系统。

    为了获得更准确的性能结果,您应该在对应用程序进行充分的热身之后对其进行度量。这是因为需要由HotSpot JIT编译字节码。通常,您可以在将负载应用于某一特性至少10分钟后,通过以下方法度量实际性能值:磨床负载测试工具

    欧内斯特调谐

    如果ngrerder的执行结果符合预期,则不需要对应用程序的性能进行调优。如果性能不符合预期,则需要执行调优以解决问题。现在,您将看到一个接一个的方法。

    如果停止世界需要很长时间

    短的停止这个世界不适当的GC选项或不正确的实现可能会造成时间问题。您可以根据分析器或堆转储的结果来确定原因。这意味着您可以在检查堆的对象类型和数量之后判断原因。如果发现许多不必要的对象,最好修改源代码。如果在创建对象的过程中没有发现特定的问题,最好只是更改GC选项。

    要适当地调整GC选项,需要在足够的时间内保护GC日志。你需要了解在什么情况下停止世界需要很长的时间。

    在这种情况下,cpu使用率很低。

    当阻塞时间发生时,TPS和CPU使用率都会降低。这可能是由于系统互操作或并发问题造成的。要分析这一点,可以使用对线程转储或分析器结果的分析。

    您可以使用商业分析器进行非常准确的锁分析。然而,在大多数情况下,只使用cpu分析器就可以获得令人满意的结果。jvisual alvm.

    在这种情况下,cpu使用率很高。

    如果TPS很低,但CPU使用率很高,这很可能是低效率实现的结果。在这种情况下,您应该使用分析器查找瓶颈的位置。您可以使用jvisual avm, TPTP或JProbe.

    调谐方法

    建议您使用以下方法优化应用程序。

    首先,您应该检查性能调优是否必要。绩效评估的过程并不是一件容易的工作。你也不能保证任何时候都能得到满意的结果。因此,如果应用程序已经达到其目标性能,则不需要对性能进行额外投资。

    问题就在一个地方。你要做的就是修好它。这个帕累托原理也适用于性能调优。这并不意味着强调某个特性的低性能必然是由单个问题造成的。相反,这强调在接近性能调优时,我们应该关注一个对性能影响最大的因素。因此,在修复了最重要的问题之后,您可以处理另一个问题。建议你一次只解决一个问题。

    你应该考虑气球效应..你应该决定放弃什么才能得到一些东西。您可以通过应用缓存来提高响应能力,但是如果缓存大小增加,执行完整GC所需的时间也会增加。一般来说,如果您想要少量的内存使用,吞吐量或响应能力可能会恶化。因此,您需要考虑哪些是最重要的,哪些是次要的。

    到目前为止,您已经阅读了用于Java应用程序性能优化的方法。为了介绍业绩衡量的具体程序,我不得不略去一些细节。不过,我认为这可以满足大多数优化JavaWeb服务器应用程序的情况。

    祝性能调优好运!

    原文:https://zhuanlan.zhihu.com/p/72691447

    来源:知乎

    作者:蛙课网

    本文为二次转载,原文不可查

    相关文章

      网友评论

        本文标题:Java应用程序性能优化的原理

        本文链接:https://www.haomeiwen.com/subject/smnahctx.html