严苛的西伯利亚JVM:关于Excelsior JET的精彩采访

我们最近了阿里巴巴用来使OpenJDK生活更容易接受的技巧。 有这样的评论:“事实证明,尽管我们在遭受普通Java的折磨,但中国人已经做出了自己的特别贡献。” 阿里巴巴固然令人印象深刻-但俄罗斯也有自己的基础项目,他们在那里也生产“特殊Java”。


在新西伯利亚,已经有18年的历史了,他们一直在完全独立地编写自己的JVM需求远远超出了俄罗斯的边界。 这不仅是某种HotSpot分支在做相同的事情,而且要好一些。 Excelsior JET是一套解决方案,可让您根据AOT编译执行完全不同的操作。 您可以说:“ Pff,AOT在GraalVM中。” 但是GraalVM仍然是一个非常具有探索性的东西,JET是在生产中使用的可靠解决方案。


这是对 Excelsior JET 开发人员之一的采访 。 我希望对于每个想要发现Java可以完成的新事物的人来说,它都会特别有趣。 或者,对JVM工程师的生活感兴趣的人和他们自己想要参与其中。



在秋天,我飞往新西伯利亚Java会议之一,我们与Ivan Uglyansky dbg_nsk和Nikita Lipsky pjBooms (JET的​​开发人员之一)坐了下来,并记录了这次采访。 Ivan从事JET运行时:GC,类加载,多线程支持,性能分析,GDB插件。 Nikita-JET项目的发起者之一,参与了从内核到产品属性的几乎所有产品组件的研发-JVM级别的OSGi,Java Runtime Slim Down(JET中的Java模块已于2007年推出),两个字节码验证程序,支持弹簧靴等。




Oleg Chirukhin:您能向无知的人介绍您的产品吗?


尼基塔·利普斯基(Nikita Lipsky):令人惊讶的是,我们进入市场已有18年,而我们所了解的并不多。 我们正在做一个不寻常的JVM。 押注AOT编译异常,即 我们尝试预先将Java字节码编译为机器代码。


最初,该项目的想法是使Java快速发展。 生产力是我们进入市场的目的。 而且,正如我们所走的那样,仍然可以解释Java,并且将静态编译为机器代码的承诺甚至不会提高Java性能很多倍,而是要提高几个数量级。 但是,即使存在JIT,如果您预先编译所有内容,那么您就不会在运行时花费资源进行编译,因此,您可以花费更多的时间和内存并最终获得更多的优化代码。


除了性能之外,静态字节码编译的副作用是保护Java应用程序免于反编译。 因为编译后没有字节码,所以仅保留机器码。 与Java字节码相比,将其反编译为源代码要困难得多。 其实不可能。 也就是说,它可以被分解,但是您不会生出源代码。 但是Java源代码可以很容易地从字节码生成为变量名,为此有很多工具。


另外,曾几何时,假设所有计算机上都安装了Java,则您以字节码的形式分发Java应用程序,并且它们在各处执行相同的操作。 但是实际上,一切都不是很好,因为一个拥有一个Java,另一个拥有另一个Java。 因此,如果您以字节码的形式分发程序,则可能会发生各种意外,首先是用户根本无法启动您的程序,最后是您自己无法显示的某些奇怪行为。 我们的产品始终具有您仅将Java应用程序作为本机应用程序分发的优点。 您对用户是否值得(或不值得)的运行时没有任何依赖。


Ivan Uglyansky:通常,您不需要安装Java。


Oleg:仍然依赖操作系统,对吗?


尼基塔:对。 许多人批评说,如果您编译成本机代码,那么“一次编写-在任何地方运行”的口号就停止工作。 但是事实并非如此。 我在报告中定期谈到“一次编写”听起来像“一次编写”,而不是“一次构建”。 也就是说,您可以在每个平台上构建Java应用程序,并且该应用程序将在任何地方都可以使用。


奥列格:到处都是?


Nikita:无论在何处获得支持。 我们有一个Java兼容的解决方案。 如果您使用Java编写,它将在Java工作的地方工作。 如果您使用我们提供的编译器,那么我们将在哪里提供支持-Windows,Linux,Mac,x86,amd64,ARM32。 但是在我们不支持的地方,您仍然可以对应用程序使用常规Java,也就是说,在这种意义上Java应用程序的可移植性不会受到影响。


奥列格(Oleg):是否存在在不同平台上以不同方式实施的此类设计? 尚未完全实现的平台部分,一些标准库。


伊万:发生了,但这不是JET特有的。 例如,您可以查看JDK本身中的AsynchronousFileChannel实现,这在不同的Windows和Posix上是完全不同的,这是合乎逻辑的。 有些事情仅在某些平台上实现,支持SCTP(请参阅Windows上的sun.nio.ch.sctp.SctpChannelImpl)和SDP(请参见sun.net.sdp.SdpSupport)。 在这方面没有特别的矛盾,但事实证明,“一次编写,随处运行”并不是很正确。


专门讲一下JVM的实现,然后在不同的OS上,差异当然是巨大的。 在OS X的主线程中,您需要运行Cocoa事件循环是一个事实,因此那里的启动与其余的不同。


Nikita:尽管如此,从外部看,对于用户而言,它们的外观和工作原理几乎相同。


奥列格:表现如何? 在所有平台上都一样吗?


尼基塔:有所不同。 例如,Linux文件系统比Windows文件系统更好,更快地工作。


Oleg:在处理器之间进行移植吗?


Nikita:这是一个有趣的活动! 整个团队突然开始移植。 娱乐时间通常为六个月至一年。


Oleg:碰巧另一个平台上的某些代码开始放慢速度吗?


伊万:这可能是由于我们根本没有时间进行或采用某种优化。 它在x86上运行良好,然后我们改用了AMD64,但并没有适应它。 因此,它可能会变慢。


另一个性能示例。 ARM的内存模型很弱,您需要在其中放置更多的障碍,以确保一切正常工作。 我们使用了AMD64,然后在某些地方工作,认为是免费的,因为那里的内存模型不同。 在ARM上,您需要设置更多的障碍,但这并不是免费的。


奥列格(Oleg):让我们现在谈论一个热门话题-“嵌入式设备上的Java”。
假设我正在制造一架可以在Raspberry Pi上进行控制飞行的飞机。 一个人这样做时会遇到哪些典型问题? JET和一般的AOT编译在这方面如何提供帮助?


Nikita: Raspberry Pi上的飞机当然是一个有趣的话题。 我们制作了ARM32,现在JET在Raspberry Pi上。 我们有不计其数的嵌入式客户,但是谈论他们的“典型”问题的人并不多。 尽管他们在使用Java时遇到了一些问题,但不难猜测。


伊万: Raspberry Pi上的Java有什么问题? 内存消耗存在问题。 如果您需要的太多,那么应用程序和JVM将很难在可怜的Raspberry Pi上生活。 另外,重要的是要在嵌入式设备上快速入门,以使应用程序不会在那里太长时间加速。 AOT很好地解决了这两个问题,因此我们正在努力改善嵌入式支持。 具体来说,对于Raspberry Pi,值得一提的是Bellsoft ,该公司现在正在与HotSpot积极合作。 普通Java在那里完全存在。


Nikita:此外,嵌入式系统上的资源很少; JIT编译器无处可部署。 因此,AOT编译本身可以提高性能。


同样,嵌入式设备没有连接到电池上的网络。 如果可以预先组装所有东西,为什么要为JIT编译器提供电池?


奥列格(Oleg):您具有哪些功能? 我了解JET是一个非常庞大的复杂系统,包含了所有内容。 您有一个AOT编译,即可以编译一个可执行文件。 还有什么 有哪些有趣的组件值得讨论?


伊万:我们有许多与性能相关的功能。


最近,我谈到了PGO,这是我们相对较新的功能。 我们直接在JVM中有一个内置的探查器,并且基于它收集的探查器进行了一系列优化。 根据配置文件重新编译后,我们通常会获得严重的性能提升。 实际上,性能信息已添加到我们强大的静态分析和优化中。 这是一种稍微混合的方法,可以充分利用JIT和AOT编译的优势。


我们有两个出色的功能,可加快启动速度。 第一种是,当您查看最初刺穿内存页面的顺序时,只需监视它并相应地链接可执行文件即可。


Nikita:其次-启动可执行文件时,您会了解正在拉起哪些内存,然后以任何顺序拉出它们,而不是立即拉出所需的内存。 也大大加快了发射速度。


伊凡:这些是杂货店的个人特色。


Nikita:第一个叫Startup Optimizer,第二个叫Startup Accelerator。 功能工作方式有所不同。 要使用第一个,您需要在编译之前运行该应用程序,它将记住执行代码的顺序。 然后,将以正确的顺序链接此代码。 第二个是在编译后启动您的应用程序,然后我们已经知道发生了什么事情,在哪里,然后我们在启动时按正确的顺序刺穿了所有东西。


除了与性能相关的功能外,还有许多产品功能使JET的使用更加方便。


例如,我们可以打包Windows发行版。 一次-并获得Windows安装程序。 您可以将Java应用程序分发为真实的本机应用程序。 还有更多。 例如,当应用程序使用其自己的类加载器时,AOT编译器和Java存在这样的标准问题。 如果您有自己的类加载器,则不清楚AOT将编译哪些类? 因为类之间的解析逻辑可以是任何东西。 因此,除了我们的之外,没有一个Java AOT编译器可与非标准类加载器一起使用。 在AOT中,我们对某些类别的应用程序提供特殊支持,我们在其中了解其自定义加载程序的工作方式,以及如何解析类之间的链接。 例如,我们支持Eclipse RCP,并且有一些客户在Eclipse RCP上编写桌面应用程序并与我们一起编译。 有对Tomcat的支持,在那里也使用了自定义加载程序。 您可以与我们一起编译Tomcat应用程序。 我们最近还开箱即用地发布了Spring Boot JET版本。


奥列格(Oleg):“下面”有哪台服务器?


尼基塔:无论您想要什么。 Spring Boot支持的功能将与此配合使用。 Tomcat,Undertow,Jetty,Webflux。


伊凡:在这里有必要提到,对于Jetty,我们没有其自定义类加载器的支持。


Nikita: Jetty,作为独立的Web服务器,具有自定义的类加载器。 但是有诸如Jetty Embedded之类的东西,它可以在没有自定义加载程序的情况下工作。 Jetty Embedded在Excelsior JET上安静地运行。 在Spring Boot内部,Jetty将在下一版本中工作,就像Spring Boot支持的任何其他服务器一样。



Oleg:实际上,JET的用户界面是javac和Java,还是其他?


伊万:不。 对于用户,我们有几种使用JET的选项。 首先,这是一个GUI,在该GUI中,用户按下按钮并编译应用程序后,用户将刺穿所有功能。 当他想制作一些安装程序以便用户可以安装应用程序时,他再次拨动按钮。 但是这种方法有些过时了(GUI早在2003年就开发了),所以现在我们有了Nikita为Maven和Gradle开发和开发插件,这些插件对于现代用户来说更加方便和熟悉。


Nikita:用pom.xml或build.gradle替换七行,例如mvn jet:build ,然后在输出上放一个香肠棒。


奥列格(Oleg):现在每个人都非常喜欢Docker和Kubernetes,您能为他们构建吗?


Nikita:下一个主题是Docker。 我们有这样一个参数-包装在Maven / Gradle插件中。 我可以为Docker添加打包应用程序。


伊万:这仍在进行中。 但是总的来说,我们尝试将JET编译的应用程序运行在Docker上。


尼基塔:行得通。 没有Java。 裸Linux,将JET编译的应用程序放在此处,然后启动。


奥列格(Oleg):使用docker的包装,输出是什么? 要用手将容器或可执行文件放入Docker文件中?


Nikita:现在,您只需编写一个特定于JET的Docker文件-这三行。 此外,一切都可以通过常规Docker工具运行。


我正在玩微服务。 我用JET编译它们,运行它们,发现彼此,交流。 JVM不需要为此做任何事情。


奥列格(Oleg):现在各种云提供商都推出了诸如Amazon Lambda,谷歌云功能之类的东西,我可以在那里使用它吗?


Nikita:我认为我们需要去找所有这些东西的提供者,并说如果您使用我们,那么您所有的lambda都会更快地工作。 但这仍然只是一个想法。


奥列格:所以他们真的会更快地工作!


尼基塔:是的,很可能在这个方向上还需要做更多的工作。


Oleg:我发现lambda编译时出现问题。 您的编译时间是几点?


伊万:确实存在,这是使用JIT的普通JVM用户无法考虑的问题。 通常,毕竟,如何-我启动了应用程序,它可以工作(尽管起初由于编译缓慢)。 这是用于AOT编译整个应用程序的单独步骤。 这可能很敏感,因此我们正在努力加快这一阶段。 例如,当仅重新编译应用程序的更改部分时,我们将进行增量重新编译。 我们称其为智能重新编译。 我们只是在最后一次处女座时与Nikita做到了,我们是一对。


Nikita: Java和智能重新编译存在某些问题,例如Java应用程序内部的循环依赖关系-它们无处不在。


伊凡:在您考虑完成此任务之前,那里存在许多相当不明显的问题。 如果您有可以进行各种全局优化的静态AOT编译器,那么计算确切需要重新编译的内容就不那么容易了。 您需要记住所有这些优化。 优化可能是不平凡的。 例如,您可以进行各种复杂的虚拟化处理,以内联魔鬼知道的地方。 如果您更改了一个经典或一个JAR,这并不意味着只需要重新编译就可以了。 不,这更加令人困惑。 您需要计算并记住编译器已完成的所有优化。


Nikita:实际上,所做的事情与JIT做出去优化决定时所做的事情相同,但仅在AOT编译器中。 只有解决方案不是关于优化,而是关于重新编译。


奥列格(Oleg):关于智能编译的速度。 如果我选择“ Hello,World”,请编译它,然后更改单词“ Hello”中的两个字母...


Nikita:它可以快速编译。


奥列格:我的意思是,不是一分钟吗?


尼基塔:秒。


伊万:但这仍然取决于我们是否在可执行文件中包含平台类。


奥列格(Oleg):如果没有这个,那有什么可能?


Nikita:是的,默认情况下,我们的平台被锯成几个DLL。 我们在一开始就实现了Jigsaw :-)也就是说,很久以前,大约90年前,我们就在组件上看到Java SE类。


伊万:关键是我们的运行时加平台类(它们都是由我们预先编译的,是的)被划分为DLL。 当运行由JET编译的应用程序时,运行时和整个平台将以这些DLL的形式呈现。 也就是说,结果看起来像这样:您使用“ Hello,world”进行编译,实际上是在编译一个类。 这会在几秒钟内发生。


尼基塔:如果在全球范围内,则需要4秒; 如果不在全球范围内,则只需几秒钟。 链接时为“全局”:将所有平台类编译成本机代码并合并为一个大型可执行文件。


奥列格:我可以做一些热装吗?


尼基塔:不。


奥列格:不? 悲伤 但是有可能生成一个DLL,再次链接它,然后...


Nikita:因为我们有JIT(顺便说一句,我们也有JIT!),当然,您可以加载,卸载和重新加载代码段。 例如,通过我们的JIT运行的所有代码都在同一OSGI中-如果需要,您可以重新加载它。 但是这里是HotSpot的热重载,当您坐在调试器中并即时更改代码时,我们却没有。 这不能在不损失性能的情况下完成。


奥列格(Oleg):在开发阶段,性能并不是那么重要。


Nikita:在开发阶段,您使用HotSpot,并且不需要任何其他功能。 我们是Java兼容的解决方案。 如果使用HotSpot并在调试中使用热重装,则一切正常。 调试,编译的JET,一切工作都像在HotSpot上一样。 应该是那样的。 通常这样。 如果没有,您写信给我们,我们理解。


Oleg:在JET中进行调试如何? JVM TI吗? 支持多少?


伊万:使用JET的核心价值之一就是安全性。 自定义代码将对任何人都不可用。 因为一切都被编译成本地的。 与此矛盾的是,我们是否支持JVM TI? 如果我们支持,则意味着任何了解JVM TI工作原理的开发人员都将能够快速访问任何内容。 我们目前不支持JVM TI。


Nikita:这是可选的规格项目。 它可能受到平台实施者的支持,可能不受支持。


伊万:有很多原因。 它是可选的,并且违反了安全性,这意味着用户不会对我们说“谢谢”。 而且她的内心非常适合HotSpot。 不久前,我们的人员将JVM TI作为一个实验项目进行了支持,他们达到了一定阶段,但是一直以来,他们一直都面临着将重点放在HotSpot上的事实。 原则上,这是可能的,但是将解决什么业务任务?


Nikita:您在HotSpot上赚了钱,但没有在飞机上赚钱,这不是您的问题。 这是我们的问题。


奥列格:明白了。 您还有其他功能吗?
不在HotSpot中,但是您有一个,它们需要直接控制吗? 我想调试,整理一下。


Nikita:恰好是一项功能。 我们有一个名为Windows Services的平台的正式扩展,也就是说,您可以以实际Windows服务的形式编译Java应用程序,该应用程序将通过用于Windows服务等的标准Windows工具进行监视。 在这种情况下,您必须选择我们自己的JAR才能编译此类应用程序。


奥列格:这不是最大的问题。


Nikita:这些服务的界面非常简单。 对于调试,您使用的不是通过Windows服务而是通过main来启动自己的应用程序的方法。 某种特定于服务的调试,我不知道是否需要。



奥列格(Oleg):假设一个以前在HotSpot工作过的新开发人员想要使用JET开发某些东西,他是否需要学习一些东西,对生活或JET有所了解?


伊万:他需要将7行复制到pom.xml中(如果使用了Maven),然后运行jet:build,并且如果JET在计算机上,则Java应用程序将被编译为可执行文件。 这个想法很简单,您不需要做任何特别的事情,只要接受它,获取可执行文件即可。


Nikita:要么您知道启动应用程序的命令行,然后将此命令行放在我们的GUI中,它就会弄清楚。 您提供了build命令,就得到了可执行文件,仅此而已。


伊万:这很简单,您不需要发明任何新东西。 热点AOT的工作方式,您自己在报告中表明,需要将所有方法的列表保存到文件中,进行扫描,进行转换-我们不需要执行任何此类操作。 只需将您的启动行放在HotSpot上,将其粘贴到特殊的GUI中,或在pom.xml中添加一小段,然后欢呼一会儿(因为它仍然是AOT编译),您将得到一个exe文件,可以运行。


Oleg:我需要学习使用GC吗?


Nikita:是的,我们有自己的GC,我们需要以不同的方式进行调优,而不是像HotSpot中那样。 我们的公共笔很少。


奥列格(Oleg):是否有一支笔“做得好”或“不做”?


伊万:有这样一支笔。 有一支笔“设定Xmx”,有一支笔“设定工人数” ...很多笔,但是为什么您需要了解它们? 如果您遇到意外情况-请写下。


当然,我们还有很多东西可以配置GC。 我们可以调整年轻一代,我们可以到达GC的频率。 所有这些都已调整,但是这些不是通常接受的选项。 我们知道人们知道-Xmx并指出来,因此我们对其进行了解析。 JET有一些更普遍接受的选项,但总的来说,一切都不同。


Nikita:我们还有一个公共选项,可让您设置允许GC在应用程序上花费的时间。


奥列格:百分比?


尼基塔:十分之一的百分比。 我们意识到兴趣太多,无礼。


伊万:如果您对GC感兴趣,那您就出问题了。


奥列格(Oleg):这些都是来自企业的人,他们在工作时间内做所有的事情-他们打开带有时间表的GC打印工作并进行打坐。 你会打坐吗


Nikita:我们公司内部有专人打坐。


伊万:我们有自己的日志格式,因此人们不太可能从中了解一些信息。 虽然,你永远不知道? 如果他们长时间看着他,也许他们可以理解。 一切都写在那里。 但是,最有可能的是,最好将我们发送给我们,我们会进行冥想。


奥列格(Oleg):但是,您当然会花钱做,但是您可以自己寻找免费赠品。


Nikita:如果您是我们的客户,那么您将获得支持,我们当然会为此提供支持。


伊万:但是,如果您有任何明显的问题,我们甚至可以说没有支持。


奥列格:如果这是某种错误?


Nikita:如果有错误,那么我们当然会永远接受所有人。 事实并非如此,“直到您购买后,我们才会修复错误”。 如果是错误,则我们将其修复。 一般来说,用户喜欢我们的支持。 通常,他们说这是非常高质量的,并且他们在任何地方都没有看到类似的东西。 也许事实是我们自己在支持下,轮流旋转。


奥列格:他们自己是谁?


Nikita:开发人员,JVM工程师。


奥列格:多久一次?


尼基塔:频率不同。 通常我们轮流坐两个星期。 但是,如果您有义务在一定天数之内做出一个大动作,那么到那时,您将获得支持的豁免权,因此您可以专注于此任务。


伊万:从理论上讲,每个人都应该依次这样做。 但是有时有人英勇地服用第二剂药物并维持一个月或更长时间,而不是两周。 就个人而言,我喜欢支持,但是如果您这样做时间太长,那么您会忘记一些生活上的事情,因为您只是开始回信。 但是您仍然想灌肠JVM。 因此,一段时间后,您需要返回。


奥列格(Oleg):您有一个层次结构,有多少层管理? 20以上?


Nikita:您是什么人,我们只有10个人。


伊万: 15与学生。


奥列格(Oleg):我的意思是说,当局参与其中还是只是在寻找?


尼基塔:关于老板。 当然,有一个主要人物,而且有许多地方领导人。


奥列格:每个人都有自己的区域吗?


尼基塔(Nikita):承担一些重大任务并加以管理的人。 它也旋转。 您可以承担一项艰巨的任务并领导一次,下一次他们将领导您。


伊凡:总的来说,我们的等级制不高。 我们只有一位老板。 而从上方看-绝对不是。 有时,如果即将发布,我们的老板会英勇地承担支持。


尼基塔:老板是一个人,他的名字叫维塔利·米克海耶夫(Vitaly Mikheev)。


奥列格:你能在某个地方看到他吗? 在会议还是其他地方?


尼基塔:总的来说,我在会议上的发言始于新西伯利亚的圣彼得堡Java日,它是由甲骨文的Belokrylov组织的,他现在在Bellsoft。 他问我们是否想发言,然后我们与Vitaly一起演出。 然后我建议他继续一起表演,但他决定他不再想要这样做。


奥列格:什么样的报告?


Nikita: “图片中有一个JVM的故事


伊万:我记得这份报告,那时候我要么是实习生,要么就不再是一个。 而且我仍然认为这是我所见过的最好的报告之一。


尼基塔(Nikita):也许这是您人生中第一次表演时充满活力的“首屈一指的效果”。


奥列格:你在说什么?


Nikita:从头到尾,他们在一起谈论了JET长达20分钟。


奥列格(Oleg):两个,只有20分钟? 通常,当有几个人时,报告时间只会增加。


Nikita:我们非常热烈地谈论了所有关键主题。


奥列格(Oleg):Vanya,这是否影响了您下一步的决定?


伊万:可能是!


奥列格(Oleg):只是人们通常问为什么要参加会议,演讲,为什么要听一些东西,如果可以谷歌搜索。


Nikita:当然,我认为参加会议非常有用。 当您进行实时联系,直接参与时,根本就不会在YouTube上看到什么。 重要的是您必须直接参与而不是虚拟参与。 您正在与消息来源联系。 两者的区别与参加现场音乐会或在录音中聆听差不多。 可能甚至很大,因为演唱会后您可以和自己喜欢的歌手谈几场? 但是在会议上,您可以找到所需的发言人,并向他询问所需的一切-没问题。


伊万:顺便说一句,关于“留在公司”的决定,这是另一回事。 我们为员工/实习生提供了一个相当独特的招聘系统。 我们通常从学院或物理系招收2-3个课程的实习生。 学员们非常沉迷于该主题,策展人帮助他们了解各种VM机制,实施细节等。 -花费很多。


一段时间后,他们开始执行战斗任务,在生产中编写真实代码。 您对JVM进行了更改,并进行了检查,测试和基准测试-检查它们是否没有下垂。 您是第一次提交。 之后,您将专注于文凭。 通常,文凭也是JVM(实验,研究)的重要组成部分。 这通常是由学生完成的。 然后,您可能会生产它-也许不会。 我从来没有见过这样的事情,所以花了很多时间在实习生身上。 我个人对此非常感激,因为我记得自己花了多少时间。 输出是JVM工程师。 这样的工厂在哪里还有JVM工程师的生产?


奥列格(Oleg):您不担心实习生会泄漏信息,那么他们会在文凭中公开描述这一切吗?


尼基塔:这不是问题,因为我们担心国外有泄漏,尤其是没人会读俄文,这就是这样的保护,令人困惑:-)


伊万:今年我有一名学生在为自己辩护,我是学校的领导者,这个问题使得并非每个人都想写文凭。 我们从一个完全封闭的话题中揭示了一些东西,例如,一位审阅者问我们为什么不谈论某些事情。 我告诉他,你不能谈论它,这是非常秘密的,我们不能。 是的,我会在您耳边告诉您,但不会在其他任何地方出现。 因此,我们对此有所担心,但总的来说,您可以在文凭中找到很多有趣的东西。


奥列格(Oleg):以及如何寻找涉及Excelsior的文凭?


尼基塔:来到院长办公室,要求读这样的文凭。


伊万:我们网站上有一份成功辩护的文凭列表,但只有名字,没有链接。 而且我们没有未成功辩护的人。


奥列格(Oleg):他们要么死要么为自己辩护。


伊万:是的! 我们的毕业生平均分数为5.0,有些人根本没有文凭。


奥列格(Oleg):在这次培训中,JVM工程师的工厂告诉我们成为Jedi的步骤是什么? 当它们给您光剑时,您何时可以开始挥舞它们?


尼基塔:很快。 现在,年轻人正痛苦地迅速成为绝地武士,我为他们感到骄傲。


伊万:顺便说一句,当我成为实习生时,尼基塔是我的第一任策展人。 关于实习:首先您要进行选择:您解决问题,参加一个或多个面试。 如果一切正常,那么您将成为一名实习生。 首先,您阅读有关最可能与您的未来文凭相关的主题的科学文章,或者仅阅读英语中的关于JVM的主题以获取上下文。 您阅读,撰写关于他们的文章,解释那里发生的事情。 他们对他很强硬。 一些学者会羡慕这样的校对和这样的论文准备。 事实证明,这是俄文的完整文章。 在那之后,是时候编写代码了,并且慢慢地介绍了问题的本质-一切如何工作。


尼基塔:这就是科学的结局。


伊万:不一定!


Nikita:很可惜,我们从零开始就发表了我们在ACM杂志上发表的文章。


伊万:恩,我们现在正在做,这是什么问题?


Nikita:我们在ACM杂志上最近发表的文章是什么?


伊万:所以在ACM中,我们只是没有尝试! 现在,我们正在写博客 -是同一回事,只有人们才能阅读。 这是类似的活动。


回到绝地的话题,这是您第一次在严格的控制下进行生产。 需要完成一项与您未来的文凭无关的小任务。


奥列格(Oleg):例如,写评论。


伊万:不。 真正的功能。 学生必须做出他的第一个真正的贡献,以便他留在产品中。 , - , . , -, — . , . , JVM-.


: ? ? - , , - ? ?


: , . - — - , , , , , , JVM. , , , . , : « !». .


: JET?


: , JVM .


: - , JET — JET. , - , : baseline-. , . , , JET .


: ?


: , . , .


: - , baseline .


: , baseline JIT. , JIT , . , baseline. . - , baseline, .


: - UI-? .


: . . Windows.


: , . , Mac.


: Android ?


: . , Android Linux-, Linux . Linux Android . - . .


: ?


: ? 不行


: Android Native SDK. DLL .


: , - , . SO- - , , Linux, , , . Java Android, , SO-, Java Dalvik . 90 , , -.


: iOS ?


: . Android, iOS. , , .


: , 15 .


: iOS . , .


: , .


: ?


: , — .


: . ?


: — JVM, JVM — , , , , , — , . , . . GC - , , . , , , .


: , , , . , , . GDB .


: , . , .. , .. managed- Java/Scala, ( ) IDEA, . — GDB .


: , , unit- , !


: . . , , , . JVM. -, . , : , - « - ( ) . ».


, , — , JVM.


: ?


: .


: . . Spring Boot , JET , .


: , - . , , , — . , JIT, . , .


: JIT — , ?


: , .


: , - , .


: , ? , -, , .


: , , - -. - , , . , . , - . issue-, , . , , .


, . , — , -. , . check-in , 1.5-2 .


: Visual Source Safe, check-in. VSS , check-in . VSS, check-in .


: , JET, JVM , . 1.5-2 . JET, , . - , , , — . ? . .


: JET Scala?


: Scala.


JET Scala, JET-. JET- . , . , Scala-, scalac, …


: check-in Java- , , , .


: - , C++ ?


: , . , , .


: JVM- — , - , . — . , , , — , . , . « ». . , , , :-) — . , GC, - - . , - , , . , - . .


: , ?


: . , . , . QA-, — , . , .


: ?


: , . , , . , . C GC . , , - . , GC - — . - . ? ?


: , .


: , -, . . , — . . - .


: , , , .


: , - ?


: - , .


: JIT?


: JIT . assert, , -, , . .


: , . JCK . - JCK, , . , . UI-, GUI-, JET. - . , GitHub JET-. JET- . QA- , .


: , ? , , ?


: QA Lead — -. QA, . , . , , . , .


: , QA ? , QA-, , — , , . , , - -.


: , . , , , - . , QA Lead , . JVM-, , .


: ? - , QA- , — ?


: JCK, Oracle. Oracle , . - . JCK, - , , , .


: , JCK?


: Oracle. , JVM, - , Oracle.


: . , Open JDK, JCK.


: - , , - , — , . , , - Oracle. , , Oracle .


: ?


: . , - , «value add». JCK, Java, . JCK , — .


: ! , OpenJDK, ?


: . , 70 . , JCK, , , . , , JET , HotSpot . .


: ? .


: Oracle JVM. . « JVM» Joker.


: ?


: , . JVM. : JVM- , , , . , .


: , JCK ?


: , . mailing list, (Alex Buckley), , Java/JVM-, JVM Specification 12.


: JCK .


: JCK, Sun . , — .


: — , ?


: , . . , , CORBA. , - , . 6 , CORBA . , , HotSpot, , , .


: , — ?


: . CORBA , . Swing . JCK Swing, , . .


: « JCK».


: , , JCK . .


: ?


: , , , , , .


: , .


: - , . , . .


: , ?


: , .


: . , . : , . , JCK, Java.


, . - .


: — . , , — . , - . , . , .


: - , ? ?


: — . , - - , - - . Java - ! , GC. — — , .


: , , . (, JVM ). , ? 但是什么都没有。 , - - , . JVM , . , .


Java . , , — . Loom Metropolis, Java. - JVM, , , , , . Loom , , . . , — .


. , Java — , 5-6 Java- JPoint . , Java- (Simon Ritter, Rafael Winterhalter). , Call for Papers 31 . . , YouTube. JPoint!

Source: https://habr.com/ru/post/zh-CN437180/


All Articles