内向基金完成首轮募资
06-17
简介|近日,腾讯云开发者社区技术沙龙“腾讯开源技术”圆满结束。本次沙龙邀请了多位腾讯技术专家,深度揭秘腾讯开源项目TencentOS tiny、TubeMQ、Kona JDK、TARS和MedicalNet。
本文是杨晓峰老师对腾讯基于OpenJDK自主开发的Kona JDK开源项目的详细介绍。一、腾讯科纳的由来 1、OpenJDK 我经常听到人们谈论OpenJDK,那么它到底是什么呢?相信大家都听说过Java SE、ME、EE等规范。
通常意义上,Open JDK 的定义是指:Java SE 规范的免费开源参考实现。早在2008年,Sun就承诺逐步开源核心Java平台,包括热点、编译器和类库;第二年,Redhat加入并发布了IcedTea,这是一个完全基于GNU自由软件构建的版本。
2007年发生了非常大的变化,甲骨文从Sun手中接过了管理权,IBM加入又放弃了Apache Harmony,苹果也加入了OpenJDK。 2017年,JDK 8发布。
它是迄今为止采用最快、最受接受的版本,并且仍然是当今生产环境的主力。今年的行业调查统计显示,JDK8仍然是几乎所有厂商最重要的JDK生产版本。
2016年,经过三年的研发,JAVA 9发布了。今年发生了一系列令人眼花缭乱的变化。
首先,从技术角度来说,JDK引入了一个原生的模块化系统,这就是Jigsaw项目——JPMS(Java Platform Module System)。 JPMS 为 Java 语言和 JDK 未来的快速发展扫除了一些障碍,但也带来了一些兼容性问题,即 JDK 9 并没有像预期那样成为 JDK 8 的广泛替代品。
其次,Java从功能驱动的发布模式转变为时间驱动的发布模式。这是由于云计算等领域的快速发展,给Java带来了巨大的挑战。
传统的发布模型理想的发布周期是两年左右,但我们将 JDK 9 的实际开发又推迟了一年左右。即便如此,仍有一些计划任务没有完成。
漫长的开发周期导致大量现成的技术一直无法进入生产阶段,这大大降低了Java开发和迭代的速度。为了适应这种变化,JDK改用了半年周期的新发布模式。
第三,Oracle JDK的开源商业特性以及Oracle JDK收费政策的变化,大大缩短了JDK的免费支持周期。值得欣慰的是,虽然Java经历了“冲锋”风波,但事实上,如今OpenJDK社区的活跃度和参与度已经有了很大的提升。
腾讯、微软等厂商纷纷加入社区,开始积极为OpenJDK做出贡献。 2. Oracle JDK Oracle JDK 和 OpenJDK 之间有什么关系?简单比较一下,Oracle JDK 8 可以被认为是 OpenJDK 的超集,包括它自己的商业功能。
但发展到JDK11之后,整个JDK产品形态发生了很大的变化。从一个大型的单体应用中,已经进行了一定程度的解耦。
JMC、OpenJFX等以软件包的形式独立于JDK。 Oracle 也将其商业功能开源,因此 Oracle JDK 11 和 OpenJDK 11 之间的唯一区别是许可证。
3、腾讯Kona JDK 腾讯Kona JDK是基于OpenJDK主分支开发的JDK发行版,并遵循以下基本原则。首先,它是免费的,每个人都可以放心使用。
其次,我们将为JDK8、JDK11等LTS版本提供长期可靠的支持。第三,Kona JDK经过腾讯大规模负载验证,确保生产环境就绪。
那么,腾讯Kona和Open JDK是什么关系呢?有哪些优势和发展思路?首先,我们承诺 Kona 是一个“friend-Fork”,并将最大限度地提高 Kona 兼容性。 Kona 团队与大量内部 JDK 用户和合作伙伴团队进行了广泛的沟通,以提供高标准的兼容性、稳定性、可靠性和性能。
Kona JDK不会为了创新而创新,因为损害JDK兼容性实际上是对企业技术投入的不负责任,也会给用户带来未来的生产迁移和维护成本。另外,基于腾讯海量大数据、云等Java/JVM工作负载,我们会分享我们在如此大规模场景下的实践经验和技术积累,并以Bugfix的形式逐步开源给大家使用,增强或功能。
从社区参与的角度,我们与Open JDK社区和Oracle Java产品团队进行了沟通,并且在整个社区沟通邮件中明确了上述原则,并且我们必须严格遵循社区的治理标准,不能成为食利者。2、OpenJDK技术趋势回到OpenJDK本身,现在有哪些主要趋势值得关注?这里引用 John Rose(Oracle JVM 架构师)的总结。
1、Java-on-JavaJava-on-Java是指用Java语言开发JVM虚拟机。例如,目前的C1/C2 JIT(Just-In-Time)编译器主要是用C++开发的,代码已经很难改进。
Oracle在GraalVM等项目中逐渐实现了基于Java的JVM虚拟机,其技术将逐渐成为未来JVM的核心。目前它还处于实验阶段,但已经显示出非常令人印象深刻的结果。
例如,使用其原生机器和 SubstrateVM,在启动速度和内存占用方面可以有非常突破性的改进,即使是简单的程序也可以看到 30 倍的提升。虽然这是基于 Close-World-Asmination 的,但对 Java 的动态特性有一些权衡,离广泛实践还有一段距离,但未来是有希望的。
2.偿还一些Java语言或JVM设计和实现所欠下的债务。在Java设计中,除了原始数据类型之外,其他都是对象。
对象头和多态支持的开销是显而易见的,并且这些通常是数据的开销,而不是数据本身的要求。同时,复杂的引用关系给内存布局带来了复杂性,难以充分利用现代CPU的缓存结构。
Java语言也很难高效、优雅地表达一些复杂的数据结构和范式。这些问题将在 Valhalla 等项目中得到解决。
3、Java语法的变化Java语法在Amber/Valhalla等项目中逐渐演变,提高了代码开发的效率和代码质量。例如,JAVA 10中提供的局部变量类型推断通过上下文推断简化了代码编写并提高了代码可读性。
目前处于预览阶段的后续Switch Expression,使用表达式代替语句,大大提高了语言表达能力、开发效率和良好实践。 4. 提高了硬件级别的操作能力。
OpenJDK可以更快、更直接地操作硬件级别。主要用于巴拿马等项目的开发。
比如为大数据和机器学习提供算力支持,提供更好的本地代码交互能力,向量计算能力等。当然还有Project Loom,提高了并发编程和运行效率,引入了Fiber/Continuation解决当前Java并发开发/运行效率问题。
还有万众期待的Pauseless GC等,总的来说,JVM正在变得更加智能和高效。 3、大数据领域的实践与发展众所周知,主流的大数据技术栈要么基于Java,要么运行在JVM上。
Java和JVM提供的易于使用的语法、跨平台能力、丰富的工具、类库等,使得JVM成为大数据领域无冕之王。目前,几乎没有同等的竞争对手。
然而,当我们实际开发和维护超大规模集群、处理海量数据时,JVM逐渐出现了一些局限性。例如,在主流的Hadoop技术栈中,NM等节点的堆大小直接影响集群和数据规模,而GC稳定性与SLA密切相关。
目前,JVM在大堆GC方面还远未完善,需要进一步改进。从大数据负载特性来看,经典GC算法具有一定的水土不服程度。
我们知道,目前的设计是基于“大多数物体都是小而短命”的实践经验。然而,在 Spark SQL 等大数据负载中,我们经常会看到大量长期存在的大对象,甚至非常大的对象分配。
。大对象的分配和初始化是昂贵的,并且在G1 GC等基于Region的设计中,达到或超过Region大小50%的对象将占用一个或多个分区,剩余的空间被浪费,这限制了宝贵的内存。
资源利用效率。从大数据的业务特点来看,JVM机制也需要有针对性的修改和完善。
比如相当于一步的大数据服务,都是定时离线计算。在一天中的不同时间,应用程序行为变化很大,当前 JVM 的自适应特性出现水土不服的情况并不少见。
G1 GC预测引擎不断预测故障导致的长时间GC暂停有时会损害SLA,因此有针对性的改进至关重要。由于上述限制,很多大数据框架不得不努力在堆外进行操作,这就带来了研发和运维的效率问题。
我们在生产实践中注意到,在大数据应用中,JNI进入临界区,GC Locker触发频繁无意义的Young GC,结合大对象分配会导致JVM意外OOM。这个问题在大数据场景中更为常见。
具体可以参考下图。另外,无论是大数据还是机器学习,都离不开一个核心,那就是计算能力。
大数据依赖于机器(集群)、线程(多核)和指令(SIMD)三个层面的数据并行计算。大概过了年后,CPU Core的频率基本没有明显提升,甚至出现下降。
生产工作负载的可扩展性越来越依赖于堆CPU和堆机器。分布式集群和多线程必不可少,但JVM层面指令级的优化还没有得到足够的重视。
充分利用指令并行性是计算能力的保证之一。JVM矢??量化/SIMD通常有三种方式:一是JNI直接使用原生代码,但由于CPU的可变性等原因,开发和维护非常困难。
其次,对于普通开发者来说,自己开发JVM Intrinsic也并非不现实。第三,使用JVM提供的Auto-Vectorization能力更加可行。
然而,自动矢量化功能也有很多限制。目前,SupperWord Optimization仅在C2中提供。
它依赖于Counted Loop的Loop Unrolling,开发难度大且比较脆弱。目前,OpenJDK孵化中的Vector API可以极大地提高开发效率,从而提高性能。
未来,我们将积极推动其发展和成熟。在大数据场景的诊断和调优方面,Kona内部集成的Java Flight Recorder(Oracle开源)提供了生产环境可用的全栈JVM Profiling能力,并且提供了无需Heap Dump即可诊断内存泄漏的可能,适合海量分布对于集群、频繁的大/超大型堆等大数据场景非常有帮助。
它还帮助我们进一步了解大数据加载整体的一般开销,例如序列化/反序列化、内存(对象)分配等。我们将与社区合作增强 jmap 等 SVC 工具,优化一般开销,并回馈社会并与社区分享我们的经验。
4.问答:杨老师,我想问一下腾讯云目前的Open JDK和Kona JDK有什么区别?这样做有什么好处呢? A:Kona JDK基于Open JDK的主分支,并根据微服务、Serverless、大数据等大量实际应用场景的需求和痛点进行改进。目标是提供最佳的Java运行环境和相应场景的解决方案。
Kona JDK 将尽力上游功能,以最大限度地发挥 Java 生态系统的优势。在选择功能时,会充分考虑兼容性、成熟度和生产价值,强调为用户带来真正的效率和生产力。
如果确实有个别功能或 bug 修复不符合主分支上游的通用标准、工作思路等,只要具有重大生产意义,Kona 仍然可能会选择提供。笔者认为,从Java生态健康的角度来看,Kona JDK的意义和目的不是差异化,而是提供长期可靠的支持,加速OpenJDK新功能的产生,增强Java在各领域的基础实力例如数据科学和云计算。
讲师介绍了腾讯高级技术专家、中国计算机学会(CCF)系统软件委员会委员杨晓峰。他目前负责 TEG JDK 团队和 OpenJDK Committer。
曾领导Oracle Java平台北京核心类库团队、京东数据基础平台智能系统研发团队。发表专栏《Java核心技术36讲》,关注Java/JVM等基础软件在大数据、云计算等前沿领域的演进与实践。
版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
标签:
相关文章
06-17
06-17
06-17
06-17
最新文章
【玩转GPU】ControlNet初学者生存指南
【实战】获取小程序中用户的城市信息(附源码)
包雪雪简单介绍Vue.js:开学
Go进阶:使用Gin框架简单实现服务端渲染
线程池介绍及实际案例分享
JMeter 注释 18 - JMeter 常用配置组件介绍
基于Sentry的大数据权限解决方案
【云+社区年度征文集】GPE监控介绍及使用