解决所有错误,从整个堆栈,在一个地方。 遇到新的Relic错误收件箱。

现代软件播客:Java大师Ben Evans谈世界上最流行的编程语言的未来

16分钟阅读

现代软件播客标志在新遗迹现代软件播客的最新一集,我们欢迎Java Guru Ben Evans- 最近加入了什么位于阳光明媚的西班牙巴塞罗那的新遗迹欧洲发展中心仔细看看这个世界上最流行的编程语言的当前状态,New Relic对Java和开源的支持,在微服务世界中优化Java, Java反模式,等等。

本是A.Java冠军,三次javaone.摇滚明星演说家,Java书籍的多产作者,包括良好的Java开发人员,也是《优化Java.和新版果壳中的Java.他花了六年的一岁Java社区流程执行委员会(AKA JCPC)帮助定义Java生态系统的标准。领先的Ben的面试是我们无法定义的共同主持人Tori Wieldt.,一个java专家在她自己的右边,谁管理了oracleJava社区五年了。

您可以在此处收听这一集,或通过订阅新的遗物现代软件播客,获取所有剧集Libsyn或者你从哪里拿到你的播客。以下是我们与本的对话全文,为了清晰起见,我们进行了编辑:

新遗物是嵌入式播客中所附论坛的主机。但是,表达的内容和意见是参与者的内容和观点,不一定反映新遗物的观点。通过托管播客,新的遗物不一定采用,保证,批准或支持其中引用的信息,视图或产品。亚博最新版直播

在Java世界发生了什么变化

tori wieldt:Java领域发生了一些变化,Oracle最近也发表了一些声明。在高层次上,你能告诉我们这些变化是什么吗?

本·埃文斯:最大的变化真的是人民。大多数企业用于直接从Oracle下载Java二进制文件。有些人可能已经让Java是开放来源的想法,因此,他们从Oracle下载了什么是开源二进制文件,这并不是这种情况。


本埃文斯

每次你去Oracle下载这些二进制文件时,你实际上是在同意一个专有软件许可。这实际上是Oracle的选择,因为它想要为这些二进制文件提供支持,并以这种方式提供Java。它已经决定停止为Java 8和Java 11提供免费的二进制文件。显然,这个行业的大多数人仍然使用Java 8。

这对很多人来说都是一个惊喜。因此,现在正在发生的事情是,如果您是Oracle的付费客户,并且您支付Java支持,您可以继续从Oracle获取二进制文件。如果您不是付费客户,并且您不想成为一个,您需要考虑您将如何拥有您的应用程序所取决于前进的支持的Java运行时。

现在,Oracle的态度似乎是,如果你想继续使用Java,如果你不想付出代价,你应该怎么做,每次都来到最新版本的Java。Oracle介绍了更快,更具动态的发布时间表,其中新的主要版Java每六个月出现每六个月,而不是我们现在一直在看到的两三年。

如果你回想一下,Java 6和Java 7之间有很大的差距。在Java 7之后又过了三年Java 8才出现。又过了三年,Java 9才问世。现在我们突然进入了这个世界,一切都发生得很快,很快,很快。Java每六个月发布一次。Java 9 6个月后,Java 10。Java 10 6个月后,Java 11。Java 12于3月份问世。

Oracle的姿态是你只应该每六个月升级一次 - “嘿,不要担心它。有一个新的Java版本。只需升级您的应用程序即可使用新版本。”

弗雷德里克•保罗:这是他们不想做的事吗?有吗?好处让它如此频繁地更新?

本:嗯,我认为大多数企业都希望拥有稳定的平台,他们希望能够为自己的应用程序致力于新功能和修复。他们不想每六个月做家务。他们想知道该应用程序将继续运行,而不会在平台中没有任何不稳定。大多数软件团队都有很多思想。他们希望将能够帮助他们并迎接其需求的软件合作伙伴。

Java长期支持版本

tori:但是,优势是您可以更快地获得功能。所以,如果有一些java社区真的想要的东西,而不是等待四到五年来获得它,可能是他们可能会更快地获得它。

本:这是绝对正确的,对于那些想要更快做出反应的公司,以及那些拥有非常渴望获得新功能的开发团队的公司来说,这是非常棒的。但对于许多企业来说,那些关心稳定的人——也许他们处在一个受到严格监管的行业——需要一种可能,不需要进入这种更快的升级周期。

这就把我们引向了所谓的长期支持版本的讨论。Java 11是第一个被指定为长期支持版本的版本。甲骨文的目标是每三年生产一次。因此,下一个长期支持版本将是Java 17。这是一个巨大的,令人震惊的,巨大的数字。

但是,当然,绝大多数Java应用程序仍然运行在Java 8上。Oracle的前身Java 8也是一个长期支持版本。但另外一些事情发生了——Oracle现在已经停止为Java的开源版本做贡献。

OpenJDK对于Java 8和11,实际上是参考实现,它是所有Oracle发布始终开始的地方。从Java 7开始,这是Oracle产品的基础。它现在已经停止了贡献,并将开放项目的领导交给另一家公司。OpenJDK 8和11现在正在运行红色的帽子

这在Java世界中是一个巨大的转变和巨变。它的意思是,如果您现在想获得免费的Java 8二进制文件,您可以从Red Hat获得一个,因为它继续生成开源二进制文件,而不是您传统上下载的专有Java二进制文件Oracle.com

但现在在OpenJDK网站上,您可以获得二进制文件,这相当于您将从Oracle下载的Java 8二进制文件。但它现在是一个自由和开放的源许可二进制,这意味着没有什么可以支付的。如果您是一个想要长期稳定和长期支持的版本的企业,但您也不想支付支持合同,这可能提供两全其美的佼佼者。

唯一的代价是您必须将您的系统从使用Oracle二进制文件(Oracle现在不再支持Oracle二进制文件,除非您是付费客户)迁移到这个新的开源OpenJDK二进制文件。

tori:什么都不做不是一个选项,对吧?

本:什么都不做不是一个选项。特别是如果你想要保护和更新你的安全补丁,因为Oracle不会提供更多的Java 8或11安全更新,除非你花钱购买。我认为,任何关心自己的应用程序,并希望确保它们被修补和更新的人,都必须确保他们确实实现了向OpenJDK的过渡。

新的Relic Java支持

弗雷德里克:现在,只是我理解,在OpenJDK方面,如果存在类似的漏洞,Red Hat将支持他们的补丁?

本:Red Hat和OpenJDK社区的许多其他成员将支持补丁。我们谈论的是这样的公司IBM亚马逊微软,以及一些较小的JDK供应商,比如Azul Systems,这长期以来是该空间的次要球员。我们还看到来自公司的一些补丁SAP阿里巴巴来自中国。

对于New Relic的用户来说,这意味着你有很多选择。比如,您可能已经与IBM或Red Hat建立了现有的关系,或者您是AWS的一个大客户。好吧,你可以选择你想要使用的OpenJDK二进制文件,无论你做什么选择,只要它来自一个主要的供应商并且它是一个经过认证的二进制文件,那么New Relic就会支持你。我们不应该告诉您如何运行您的环境。你选择适合你的申请,我们会支持你。

弗雷德里克:让我们来谈谈New Relic是如何参与其中的。我们对Java和Java社区的支持是什么?

本:首先,如果你是Oracle JDK的用户,同时也是Oracle的付费用户,那就太好了,我们当然会支持你。如果您选择继续使用Java 8,并过渡到OpenJDK二进制文件,那么我们也将在那里支持您。如果是这样的话icedteat我们会支持的如果它将是OpenJDK,这是一个社区实验室的开源项目,有很多玩家聚集在它下面,那很好。这是我们将在New Relic内部使用的主要jdk之一。如果你要使用亚马逊的Corretto项目,这也是主要针对AWS和亚马逊自己的Linux版本,但如果你有这样的版本,我们将支持。无论你选择什么主要的供应商,无论什么适合你的应用程序,New Relic都会支持它。

tori:那么New Relic将如何更多地参与到Java社区中呢?

本:我们刚刚经历的分水岭是,Oracle开始退步,而其他玩家开始更多地参与进来,这为我们在New Relic提供了一个很好的机会,让我们更多地参与到社区中。显然,我们的兴趣在于监控和性能分析,因为这是我们为客户提供的。而且,我们自己的很多服务都是用Java和其他JVM语言编写的。因此,我们对Java平台的健康和长寿非常感兴趣。

我们已经签署了正式加入OpenJDK工作所需的文件。这意味着New Relic的工程师将能够为OpenJDK和相关项目贡献代码和其他工作。我认为这表明了我们对Java和Java社区的长期承诺。

这也意味着我们能够帮助我们的客户达到特别棘手的问题的底部。有一些新技术在Java 11中存在和开放,社区的感觉也将对Java 8有益。和那些技术,因为他们目前只能在Java 11上开放,需要被支持以支持Java 8.新的遗物将参与其中一些早期测试。我们在内部运行它们,所以我们将能够将它们进行测试,看看是否对他们被推到Java 8的任何影响,以确保没有性能回归或其他副作用。这是我们基本上作为给Java社区的礼物,因为我们认为这些技术将对我们的客户有益。

Java在微服务领域的应用

tori:我们来谈谈Java和优化。你写一个关于它的书我知道您在使Java运行得更快方面投入了大量精力。所以我不得不唱反调:Java在微服务世界中仍然重要吗?

本:当我们谈论微服务时,我认为有两件事才能聚集在一起,以构成人们对微服务的看法。首先是应用程序的大小和复杂性,另一个是应用程序启动时间和特定处理实际实际处理程序的终身时间。

与传统体系结构相比,微服务对每个单独服务的作用域更小,而复杂性来自于大量服务的组合或聚合。但它们也是动态的;它们可以迅速扩大规模因为它们开始的速度非常快,因为它们非常简单。

那么Java如何仍然有用呢?或者为什么人们会认为Java不是在那个世界相关?

嗯,传统上,Java进程启动了启动,JVM启动,并开始解释字节代码。但是,Java应用需要一段时间以达到稳定状态,因为一切都必须热身;特别是,JIT编译器必须处理足够的事务并看到足够的消息,它实际上可以弄清楚程序的哪些部分非常重要,以便它可以将这些部分编译为超快速优化的机器代码。虽然Java具有极好,典型的最佳,峰值性能,但达到峰值性能并达到稳定状态所花费的时间可以是半分钟的大约,也许甚至几分钟。在一个微星世界中,这听起来不那么吸引人。

Java所面临的挑战实际上是双重的。首先,我们能否缩短热身时间?第二,我们能否处理Java进程的大小?

Java 8运行时带有一定数量的包袱,这是无法回避的事实。的RT.JAR.(基本的Java运行时)本身就是150兆。这是一个写一些微小的python程序不同的数量级那将跑进AWSλ.不会以兆字节衡量 - 它可能就像一个兆字节,但肯定不是150!

好消息是,特别是在Java 11中,我们已经取得了一些重大进展,几乎完全消除了这些问题。Java 11确实改变了Java在微服务开发方面的竞争力。

例如,在启动和完成时间方面,有新的JIT编译和提前编译选项,可以用于Java 11生成非常小的二进制文件,这些文件几乎是本机编译的。所以它更像是二进制文件。您还可以减少内存占用的大小,因为不需要使用集成的Java运行时摇摆不定的RMI以及所有企业使用的功能齐全的Java技术——如果您不使用这些技术,那么为什么首先要加载它呢?

Java 11的模块化意味着您可以以缩小量的空间启动Java运行时。当然,如果要加载的东西较少,则将加载更快。由于Java 11开始渗透主流应用,我们将看到一些有趣和新颖的部署。

我认为人们喜欢Java的事情,编程环境的丰富性,它确实有这样的伟大开发者的工具,如此丰富的富有的模式和经验,当然,对于企业来说这是超级的事实容易雇用Java开发人员......我认为所有这些优势都将继续在微服务世界中发挥良好。

优化Java性能

tori:我是一个Java开发人员,我说我的应用程序太慢了,你从哪里开始让它更快?

本:你刚说你的应用程序太慢了。这是什么意思?我们需要问一个我们可以实际测量的问题。第一步总是理解问题,并找到能够帮助我们确认我们认为存在的问题的数据和指标。

像New Relic这样的工具将成为你的好朋友,因为它提供给你查看数据的能力。我们不能告诉你在你的领域什么是错的什么是对的,因为我们不是你的领域的专家——你是。但我们能做的是给你工具和可视化来查看数据,然后由你自己把你自己领域的知识放在这些数据上,看看我们告诉你的是好是坏。

一旦你确定这是不好的,那么我们可以帮助您来钻取来了解您需要修复的内容。

弗雷德里克:一旦确定了这一点,您是否可以采取最佳实践或公共线程来提高Java应用程序的性能?

本:绝对的。这几乎是一个启发式过程,你可以通过孤立正在发生的事情。也许你正在创建一堆你不需要的Java对象。您正在生成负载和大量调试级日志消息,然后不会与它们执行任何操作。这将增加应用程序流失。

当然,Java是一种垃圾收集语言。所以如果你创建了一堆对象你什么都不做,只是为了做功,那么你就会增加内存的压力。这意味着您将不得不更频繁地进行垃圾收集,这意味着您的计算机资源将从应用程序处理和实际运行组成您业务的事务中转移出来。

tori:好吧,现在它是菜的。告诉我们一些你在野外看到的反模式,头部拍打的东西。

本:好吧,在我加入新的遗物之前,我是一个独立的承包商,我被要求进入银行来看看他们的一些系统。在一个whim时,我要求看到他们的应用程序的源代码;它们正在制作它们基本上刚刚创建的调试日志消息,然后扔掉。一旦我们拍摄了大约40分钟,我们就可以看到他们的应用程序的内存利用率下降了60%。这应该是为期两周的订婚,我们是第一天的午餐时间完成的!

我所看到的其他事情:在码头容器内运行Java 8时,很多人所做的,很多人都不知道,因为Java 8预测了很多支持Docker的Linux内核;实际上存在特别早期版本的Java 8和Docker运行时之间的不匹配。

Java将看到机器上可用的所有核心。假设你有一个盒子,里面有128个cpu, 128个内核,假设你被限制在一个Docker容器中,这样你只能访问4个内核。如果你没有明确地告诉Java去限制它的线程数,特别是,比如说,垃圾收集线程,那么Java将会看到128个内核。当垃圾收集阶段开始时,它将创建128个垃圾收集线程,因为这与机器上的核数相匹配。

问题是你实际上只有8个cpu被Docker分配给你。现在发生的是,你有128个任务试图清理你的垃圾,但只有8个槽让它们运行。所以他们互相争斗。在尝试获得8个可用核的调度时间方面存在争议。

tori:它变成了排队的噩梦?

本:绝对的。上下文切换和抖动。这是我们看到的另一个反模式的好例子。

当然,它会出现在New Relic中,因为我们有线程分析器你可以看到,如果你点击一个Docker容器,如果你没有正确设置标志,你会看到,“哇,这个Docker容器只有8个cpu,但在profiler中,我可以看到所有这些垃圾收集线程。为什么要生产这么多呢?”这些东西在New Relic也能看到。

请继续关注

如果您喜欢您所听到的,请务必订阅新遗迹现代软件播客iTunes.Libsyn一夜钉箱机,或者在任何你获得播客的地方。

注意:现代软件播客的音乐是由Audionautix