我们正在升级FutureStack的注册,仅到4月30日。条款和条件适用。 现在注册

Java的现状:世界上最流行的编程语言之一的趋势和数据

8分钟阅读

这篇文章的版本以前跑了新堆栈

现代软件产业是巨大的,而且不缺乏可供选择的编程语言。然而,即使是在单一的技术堆栈中(比如Java生态系统),也很难对其市场得出有用的结论。Java非常成功,它几乎出现在每个主要行业和经济部门中——这在一定程度上使得很难就Java生态系统的状态得出单一的声明性观点。

但这并不意味着我们不能评估世界的现状。

每天,数以千万计的Java虚拟机(jvm)与New Relic共享他们的数据。为了构建此报告,我们对该数据进行了匿名化处理,并有意对其进行了粗粒度处理,以便对我们所看到的Java生态系统进行一些广泛的概述。我们还避免了任何可能帮助攻击者和其他恶意方的详细信息。

我们希望这些观察结果提供了一些新的背景和关于Java Ecosystem的状态的见解。有了这一说,我们看了以下问题:

  • 在生产中使用哪些Java版本?
  • 什么是最受欢迎的供应商?
  • 最常用的垃圾收集算法是什么?
  • 最常见的堆大小配置是什么?

Java 8目前仍然是标准

让我们从一个问题开始,Java开发人员总是好奇:哪些版本最适用于生产环境?请考虑下表:

Java版本 %在使用
14 0.00
13 0.32
12 0.17
11 11.11
10 0.48
9 0.18
8当前 42.02
8落后 38.63
8脆弱 3.83
7 2.54
pre-7 0.73
非LTS. 1.14

注意:我们将Java 8的结果分为三个部分:

  • 电流:最近更新过,不会受到最近主要cve的攻击
  • 滞后:与Java版本的年代有关的潜在的重大风险
  • 易受伤害的:这可能是运行这些版本的团队严重关注的一个来源

正如您所看到的,Java 11——一个长期支持的发行版——正在慢慢地流行起来,但是与Java 8(也是LTS)相比,市场似乎仍然犹豫不决。我们也看到了对非lts版本的缺乏采用——java 7的使用率(2.54%)仍然是所有java 8后非lts版本的两倍多(1.14%)。

非oracle供应商的崛起

我们在过去一年中观察到的另一个主要动态是社区中对非oracle Java供应商的接受度在增加。

[表ID = 42 /]

Oracle现在仅包含75%的Java市场。社区主导AdveropeNJDK.是第二受欢迎的供应商。我们的历史趋势数据(我们还没有发布,因为它基于比主数据集小得多的样本)表明,AdoptOpenJDK的受欢迎程度逐月显著上升。

特别值得注意的是,在Gaseropenjdk VM的群体中向新遗物报告几乎三分之一(33.19%)是Java 11.这代表了GeacoPenjdk用户中Java 11的使用率比一般人群更高的使用率。

注意:为了全面公开,New Relic是AdoptOpenJDK项目的赞助商,并为该项目贡献了工程时间。

如何垃圾收集算法票价

由于它在内存管理中扮演的角色,垃圾收集是Java社区中有无限兴趣的主题。根据我们的数据集,各种垃圾收集算法的市场占有率如下:

(表id = 43 /)

广泛地,这些选择反映了在不同Java版本中使用的默认收集器。但是,当我们按JVM版本的方面,一些有趣的结果出现:

  • CMS在Java 8上比G1更受欢迎(14.56%与12.59%)
  • 在Java 11上,CMS比Parallel更受欢迎(3.96% vs. 0.20%)
  • CMS在Java 11上比ZGC更受欢迎35倍。

检入堆配置

没有看,没有关于Java中的垃圾收集和内存管理的讨论堆大小配置。堆大小配置由一对值定义—堆最小值和最大值(通常称为Xms和Xmx)。下表列出了基于我们的数据的前30个最常见的堆大小,为了便于理解,我们将它们标准化为MB。

[表ID = 44 /]

令人惊讶的是,这表明JVM堆大小仍然相对较小——这似乎与产生满足越来越大堆的算法的驱动力形成了对比。

特别是,可能超过16GB的堆(例如,设置Xmx >= 16GB)只占总堆数的3.3%。

“固定堆”标志组合的继续外观 - XMS和XMX具有相同的价值 - 是另一个主要的惊喜。我们的数据显示,33.48%的JVMS仍然使用此组合运行。

在非常早期的自适应尺寸算法的版本中,可能对这种组合运行可能存在一些优势,但对于现代工作负载,它几乎总是对抗策略性。如果设置此组合,则JVM被限制为如何调整大小和塑造堆,这使得响应于流行行为或请求率的突然变化。

如果此组合出现在您的运行时中,您可能希望运行一些测试,看看是否可以删除它以获得更好的垃圾收集性能。

一些随机的,但有趣的东西

总结一下我们观察到的5个有趣数据:

  1. 7.35%的Java 8 JVM使用弃用标志(尤其是MaxPersize)运行。
  2. 所有JVM的6.78%通过启用实验标志运行。
  3. 8.07%的jvm有在启动字符串中出现不止一次的重复标志。
  4. 2.54%的JVM有“不匹配的旗帜”,说矛盾的东西;例如,标志指定并行GCG1GC。
  5. 2.59%的jvm设置的最大堆大小为819MB。这几乎肯定是8192MB(即8GB)的错误。仔细检查你的配置——剪切和粘贴配置是危险的。

结论思考

当然,我们的数据并不完美。本报告中的主要偏见是我们只看到向新遗物报告的数据。这绝不是Java市场的完全准确表示,我们认识到我们的数据中有选择和其他不明显的偏见。

此外,我们意识到本地化趋势可能导致我们所呈现的内容的显着小规模变化。例如,特定行业的Java团队(如医疗保健或金融服务)通常在严格的规定下运作,防止他们及时在版本之间移动。

但是,我们每天都会看到来自数百万JVM的实时数据,并且变化的数据流代表了整个Java市场的代理。

我们将这些数据呈现给Java社区,希望以一种积极的方式为正在进行的关于Java整体发展轨迹的有趣对话做出贡献。我们的目的绝不是声称“我们拥有所有的答案”或诋毁他人的工作。这是一个共享的旅程,不同的方法,比如Redmonk完成了最近的分析,可以组合起来为每个人提供更好的整体理解。

每个New Relic的客户都可以访问他们的生产环境的这个细节级别,而不需要额外的成本。如果你是New Relic的用户(或者你愿意),并且想要看到这些见解,联系你的New Relic联系人,看看如何查询这些数据,或者构建自己的仪表板来跟踪它。

我们将非常乐意帮助您按照自己的方式观察您的系统,因为您正在继续生产更完美的软件。

想知道Java在无服务器开发中的表现吗?看看我们的报告对于无服务器的热爱:2020 AWS Lambda开发人员,Devops和决策者的基准报告