Kona JDK 在腾讯大数据领域内的实践与发展
导语 | 近日,云+社区技术沙龙“腾讯开源技术”圆满落幕。本次沙龙邀请了多位腾讯技术专家,深度揭秘了腾讯开源项目TencentOS tiny、TubeMQ、Kona JDK、TARS以及MedicalNet。本文是杨晓峰老师关于腾讯基于OpenJDK的自研Kona JDK开源项目的详细介绍。
一、Tencent Kona 缘起
1. OpenJDK
经常听人谈到 OpenJDK,那它到底是什么呢?相信大家都听说过 Java SE、ME、EE等规范, 通常意义上对 Open JDK 的定义指:Java SE规范的一个免费和开源参考实现。
最早在2006年时,Sun承诺逐步开源核心 Java Platform,包括hotspot、Complier和类库等;第二年,Redhat加入,并发布IcedTea,也就是完全基于GNU自由软件构建的版本。
2010年时发生了一个非常大的变化,Oracle从Sun手中接过Stewardship,IBM加入并放弃Apache Harmony,Apple也加入OpenJDK。
2014年,JDK 8发布,它是迄今为止采纳速度最快和接受程度最高的版本,至今仍是生产环境的主力。业界今年的调查统计显示, JDK8 仍然是几乎所有厂商最主要的生产版本JDK。
2017年,经过三年的研发,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仅存在License的不同。
3. Tencent Kona JDK
Tencent Kona JDK是基于OpenJDK主分支开发的JDK发行版,并坚持下面几个基本原则。
第一,它是免费的,大家可以放心使用。
第二,我们会针对JDK8、JDK11这样的LTS版本,提供长期、可靠的支持。
第三, Kona JDK经过腾讯海量的负载验证,确保生产环境就绪的能力。
那么,Tencent Kona 和Open JDK之间是什么关系?有哪些优势和发展思路呢?
首先,我们承诺Kona是一个“friend-Fork”,并会最大化地保证Kona兼容性。Kona团队与大量内部JDK使用者和合作伙伴团队等进行了广泛沟通,提供高标准的兼容性和稳定性、可靠性、性能。
Kona JDK不会为了创新而创新,因为伤害JDK兼容性其实是对企业技术投资的不负责任,也会给使用者带来未来的生产迁移和维护成本。
另外,基于腾讯海量的大数据、云等各种Java/JVM负载,我们会将如此规模场景下的实践心得和技术沉淀分享出来,并逐步以Bugfix、Enhancement或者是Feature的形式开源给大家使用。
从社区参与的角度,我们已经与Open JDK社区和Oracle Java产品团队作了沟通,并且整个社区沟通邮件中明确了上面的原则,严格按照社区的治理标准来要求自己,不做食利者。
二、OpenJDK技术趋势
回到OpenJDK本身,现在有哪些值得关注的主要趋势呢?
在这里引用John Rose(Oracle JVM Architect)的总结。
1. Java-on-Java
Java-on-Java,指的是以Java语言开发JVM虚拟机。
例如,目前C1/C2 JIT(Just-In-Time)编译器,主要是用C++开发的,代码已经非常难以改进,Oracle在GraalVM等项目中,逐步实践了基于Java的JVM虚拟机,其技术将逐步成为未来JVM的核心。
目前总体还处于实验性阶段,但是已经表现出非常可观的成果。例如,利用其native-machine和SubstrateVM,在启动速度和内存Footprint等方面能够有非常突破性的提高,甚至简单程序可以看到30倍的改进。
虽然这是基于Close-World-Assumption,对Java的动态特性有所取舍,广泛实践仍存在距离,但未来可期。
2. 偿还Java语言或者JVM设计实现的一些欠账
Java设计中,除了原始数据类型,其他都是对象。对象头、多态支持等开销明显,而这些对于数据(Data),往往是一种overhead,而不是数据本身的需求。
于此同时,复杂的引用关系带来着内存布局上的复杂性,难以充分利用现代CPU的缓存结构。Java语言也难以高效、优雅地表达部分复杂数据结构和范型等,这些问题将在Valhalla等项目中得到解决。
3. Java语法的改变
Java的语法在Amber/Valhalla等项目中逐步演进,提高了代码开发的效率和代码质量。比如JAVA 10中提供的本地变量类型推断,通过上下文推断简化代码编写,提高代码可读性。后续正在预览阶段的Switch Expression等,通过expression代替statements,大大提高语言表达能力,提高开发效率和良好实践。
4. 操作硬件层次能力提升
OpenJDK 可以更快、更直接地去操作硬件层次,主要是用于Panama等项目开发中。例如为大数据、机器学习提供算力的支持,提供更好的本地代码交互能力、向量计算能力等等。
当然,还有提高并发编程和运行效率的Project Loom,引入Fiber/Continuation,解决目前Java并发开发/运行效率问题。还有广受期待的Pauseless GC等等,总的来说JVM正变得更加智能、高效。
三、大数据领域实践与发展
大家知道,主流大数据技术栈,要么是基于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)三种层次的数据并行计算。大概是2002年以后, CPU Core的频率已经基本上没有明显上升,甚至有所下降,生产负载扩展性越来越依赖于堆CPU、堆机器。分布式集群和多线程必不可少,但JVM层面在指令级别的优化尚未得到充分重视,充分利用指令并行能力是算力的保障之一。
JVM向量化/SIMD通常有三种手段:
第一,JNI直接使用native代码,但因为CPU的多变等原因而非常难以开发和维护。
第二,自己开发JVM Intrinsic,这对普通开发者来说并不不现实
第三,利用JVM提供的Auto-Vectorization能力,是比较可行的。
但是Auto-Vectorization能力局限性也很多,目前仅在C2提供 SupperWord Optimization,依赖于Counted Loop的Loop Unrolling,开发有难度且比较脆弱。
目前,OpenJDK孵化中的Vector API能够大大提高开发效率,进而提高性能,未来我们将积极推动其发展和成熟。
在大数据场景诊断和调优方面,Kona内部集成的Java Flight Recorder(Oracle开源)提供了生产环境可用的全栈JVM Profiling能力,并且提供了可以不用Heap Dump诊断memory leak的可能,这对于海量分布式集群、频繁大堆/超大堆的大数据场景,非常有帮助。
也有助于我们进一步整体理解大数据负载的通用开销,比如序列化/反序列化、内存(对象)分配等等。
我们会与社区一起增强jmap等SVC工具,优化通用开销,并向社区回馈和分享我们的经验。
四、Q&A
Q:杨老师,我想问一下腾讯云现在做Open JDK和Kona JDK有什么区别?做这个有什么优势呢?
A:Kona JDK是基于Open JDK主分支,基于海量的微服务、Serverless、大数据等实际应用场景的需求与痛点进行改进,目标定位于提供在相应场景的最佳Java运行环境和解决方案。
Kona JDK会尽量upstream特性,让Java生态的收益最大化,并且在特性选取上,充分考虑兼容性、成熟度和生产价值,强调为用户带来实实在在的效率和生产力。如果确实有个别特性或bug fix,不符合upstream到主分支的通用性标准、工作思路等,但只要存在较大的生产意义,Kona可能仍会选择提供。
我认为,从Java生态健康的角度,Kona JDK的意义和目的都不在于区别,而在于长期、可靠的支持,加速OpenJDK新特性生产化速度,增强数据科学、云计算等领域的Java基础实力。
讲师介绍
杨晓峰,腾讯高级技术专家,中国计算机协会(CCF)系统软件专委委员,目前负责TEG JDK团队、OpenJDK Committer。曾领导 Oracle Java Platform 北京核心类库团队、京东数据基础平台智能化系统研发团队等,出品专栏《Java核心技术36讲》,聚焦于Java/JVM等基础软件在大数据、云计算等前沿领域的演进和实践。
Kona JDK 在腾讯大数据领域内的实践与发展的更多相关文章
- DataPipeline在大数据平台的数据流实践
文 | 吕鹏 DataPipeline架构师 进入大数据时代,实时作业有着越来越重要的地位.本文将从以下几个部分进行讲解DataPipeline在大数据平台的实时数据流实践. 一.企业级数据面临的主要 ...
- 大数据领域两大最主流集群管理工具Ambari和Cloudera Manger
不多说,直接上干货! 目前啊,都知道,大数据集群管理方式分为手工方式(Apache hadoop)和工具方式(Ambari + hdp 和Cloudera Manger + CDH). 手工部署呢, ...
- ClickHouse在大数据领域应用实践
一.序言 面向大数据量查询数据库,优点是在较大数据量(千万级)的前提下具有较好的查询性能. 1.应用场景 ClickHouse应用于OLAP(在线分析处理)领域,具体来说满足如下特点使用此技术比较合适 ...
- 这可能是AI、机器学习和大数据领域覆盖最全的一份速查表
https://mp.weixin.qq.com/s?__biz=MjM5ODE1NDYyMA==&mid=2653390110&idx=1&sn=b3e5d6e946b719 ...
- 【ArchSummit干货分享】个推大数据金融风控算法实践
作者:个推高级数据工程师 晓骏 众所周知,金融是数据化程度最高的行业之一,也是人工智能和大数据技术重要的应用领域.随着大数据收集.存储.分析和模型技术日益成熟,大数据技术逐渐应用到金融风控的各个环节. ...
- 腾讯大数据之TDW计算引擎解析——Shuffle
转自 https://www.csdn.net/article/2014-05-19/2819831-TDW-Shuffle/1 摘要:腾讯分布式数据仓库基于开源软件Hadoop和Hive进行构建,T ...
- 腾讯大数据平台Oceanus: A one-stop platform for real time stream processing powered by Apache Flink
January 25, 2019Use Cases, Apache Flink The Big Data Team at Tencent In recent years, the increa ...
- 关于大数据领域各个组件打包部署到集群运行的总结(含手动和maven)(博主推荐)
对于这里的打包,总结: (1) 最简单的,也是为了适应公司里,还是要用maven,当然spark那边sbt,maven都可以.但是maven居多. Eclipse/MyEclipse下如何Ma ...
- 包银消费CTO汤向军:消费金融大数据风控架构与实践
1 业务架构 风控平台是相对独立的系统,信审的案件可以从借款端平台推过来,也可以从第三方平台推过来.信审案件到达风控平台后,自动创建工作流,根据风控流程处理各流程环节任务. •自动决策 风控流程自动处 ...
随机推荐
- python代码覆盖率统计-coverage
coverage.py是一个用来统计python程序代码覆盖率的工具.它使用起来非常简单,并且支持最终生成界面友好的html报告.在最新版本中,还提供了分支覆盖的功能. 官方网站: http://ne ...
- Mysql————基本sql语句
mysql中的基本语法有四种: 1.DDL语句:(用CREAT和DROP操作的语句) 用于创建.修改.和删除数据库内的数据结构,如:1:创建和删除数据库(CREATE DATABASE || DROP ...
- python2查找匹配数据及类型转换
判断一个字符是否包含在另一个字符串中,如果包含,但是数据类型不同,需要进行数据类型转换 下面这个是针对python2
- 微信小游戏排行榜页滚动查看排行榜(canvas指定区域溢出滚动,懒渲染)
在微信小游戏中,好友排名数据是能在关系数据域操作,整个关系数据域只会返回一个最终的sharedCanvas,并且这个canvas不能调用toDataURL()方法,所以要展示好友排行榜的话只能在关系数 ...
- 控制webbrowser滚动到指定位置
在构造函数中添加事件: webBrowser.DocumentCompleted+=new WebBrowserDocumentCompletedEventHandler(webBrowser_Doc ...
- 吴裕雄--天生自然KITTEN编程:行走
- Django学习之路03
django项目生命周期 路由层 路由匹配 #urls中的urlpatterns #url()方法 urlpatterns = [ url(r'^admin/', admin.site.urls), ...
- JavaScript 設計模型 - Iterator
Iterator Pattern是一個很重要也很簡單的Pattern:迭代器!我們可以提供一個統一入口的迭代器,Client只需要知道有哪些方法,或是有哪些Concrete Iterator,並不需要 ...
- swoole I/O 模型
I/O即Input/Output,输入和输出的意思.在计算机的世界里,涉及到数据交换的地方,比如磁盘.网络等,就需要I/O接口. 通常,I/O是相对的.比如说你打开浏览器,通过网络I/O获取我们网站的 ...
- Bugku的一道注入
继续补sqli的题 这道题与之前的题的区别是在第二部分中加了一道waf,所以需要特殊的手段来进行注入. 题目来源:http://123.206.87.240:9004/1ndex.php?id=1 第 ...