做有温度的教育!
全国统一咨询热线:400-803-9399
北京
校区
新闻资讯> 学习心得> Java 应用程序性能优化指南一、

Java 应用程序性能优化指南一、

时间:2018-10-25
浏览:5036
发布:甲骨文华育兴业
赞:2154

  在《2018 最具就业前景的 7 大编程语言》一文中,通过分析了来自 Indeed 的 25 门编程语言、栈和框架的数据,我们盘点了18年最具就业前景的七大编程语言,其中,Java毫无悬念拔得头筹。


  那么对于开发者来说,如何让 Java 应用程序达到性能最佳?本文将一步步教你将 Java 应用程序性能优化到一流。

  本文我们将探讨一系列方法,用来提升 Java 应用程序的性能。首先定义出可度量的性能指标,然后通过不同的工具来衡量和监控应用程序性能,并找到影响性能的瓶颈所在。

  此外,我们还将展示一些常用的 Java 代码级别优化方法以及最佳的编码实践。最后,我们将深入 JVM 特定的调优技巧和架构改进方法,以提升 Java 应用程序的性能。

  性能指标

  在开始动手改进应用程序的性能之前,我们需要定义和理解非功能性需求的一些关键领域,比如可扩展性、性能、可用性,等等。

  以下是一些用来衡量 Web 应用程序性能的常用指标:

  平均应用响应时间;

  系统支持的平均并发用户数;

  在最大负载期间每秒支持的请求数。

  借助不同的负载测试手段以及应用程序监测工具对这些指标进行量化,有助于找出性能瓶颈的关键点并对其进行相应的优化,从而提升 Java 程序性能。



  监控应用程序

  想要使用 Retrace 进行 Java 应用程序的开发,首先需要在 Stackify 上注册一个免费的试用版。

  接下来,我们需要将我们的 Spring Boot 应用程序配置为 Linux 服务。我们还需要在托管应用程序的服务器上安装 Retrace 代理。

  一旦启动了 Retrace 代理与要监控的 Java 应用程序,我们即可在 Retrace 仪表板上点击 AddApp 链接。之后 Retrace 将开始监控我们的应用程序。

  寻找堆中最慢的部分

  Retrace 自动监测我们的应用程序,并跟踪多种常见框架和依赖项的使用情况,包括SQL、MongoDB、Redis、Elasticsearch 等。如果应用程序包含下列性能问题,Retrace 能够帮助我们快速找到原因:

  是否有某条 SQL 语句减缓了程序速度?


  Redis 是否突然变慢?

  是否有某个 HTTP Web 服务变缓或者 down 掉?

  例如,下图展示了在给定时间内系统中运行最缓慢的部件。



  代码级别优化

  负载测试和应用程序监控对于确定应用程序中的一些关键瓶颈非常有用。但同时,我们需要遵循良好的编码实践,尽量避免性能问题在开始应用程序监控之前出现。


  使用 StringBuilder 进行字符串连接

  字符串连接是编程中非常普遍的操作,同时也是低效率的操作。简而言之,使用 + = 来追加字符串的问题在于,每次操作都会分配新的字符串。

  以一个简化的典型循环为例,我们分别用原始的字符串连接和 builder 方式来实现。

  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 自动对字符串操作执行了编译和运行时优化。


  避免递归

  在 Java 应用程序中,由于递归导致 StackOverFlowError 错误是很常见的。

  如果我们无法避免使用递归逻辑,那么尽量使用尾递归。

  来看一个采用头递归的例子:

  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);

  }


看到这里相信大家有种意犹未尽的感觉,那么我们休息一下,整理复习下这篇文章的内容,来迎接我们下一篇的学习吧!

人生从业之路的第一步,从甲骨文华育兴业开始,

背后付出的辛苦与努力只有自己知道,而这也只是他们职业生涯的开始。

勤恳努力的人终会得到最好的回报,有些努力需要时间来回答

你吃的苦终会铺成你想要的路!

甲骨文华育兴业,为你的IT之路开启梦想之门!


【版权与免责声明】如发现内容存在版权问题,烦请提供相关信息联系我们,我们将及时沟通与处理。本站内容除非来源注明甲骨文华育兴业,否则均为网友转载,涉及言论、版权与本站无关。



大数据中hadoop是什么? ps使用 大数据 冲刺Java架构师年薪50W

友情链接: 甲骨文华育兴业太原校区 甲骨文华育兴业济南校区 甲骨文华育兴业哈尔滨校区 甲骨文华育兴业长春校区 魔据教育 音乐培训 青海律师

Copyright ©2016-2019. All Rights Reserved. 京ICP备17018991号-4

网站地图