上周去听了QCon全球开发大会,其中有几场印象比较深刻的分享,除去几个比较概念化的话题,在Java技术演进这个Topic里的几个分享都是比较有干货的(但感觉工作中用不到)

首先是关于林子熠老师分享的冷启动加速技术,听完后这几天也在思考分享中所说敢叫日月换新天的创建型技术与现有静态编译语言的对比。

演讲:天下武功,唯快不破:面向云原生应用的冷启动加速技术

分享人: 林子熠(层风) 博士 阿里巴巴 /技术专家

Java从诞生到现在已经经过了26年,在这段时间由于Java语言功能强,峰值性能高,生态支持好的特点,在市场上取得了具有引导性的地位,在这26年,Java应用在不断的发展演进,从最开始的单机版到web应用再到现在的service云原生应用,在发展的过程中也不断遇到了各种各样新的挑战,也带来了机遇促进Java向前发展,在云原生时代的应用都带来了新的特点,比如说云原生的应用程序短小、启动频繁,这都是对Java现在比较耗时的冷启动方面比较突出的挑战,那我们就要考虑Java应用启动时间会这么长,我们有什么办法可以解决这个问题?

先来看看Java启动慢的原因,参考下图。

https://shipilev.net/talks/j1-Oct2011-21682-benchmarking.pdf

这个图代表了Java运行时各个阶段的生命周期,可以看到它要经过五个阶段,首先是VM init虚拟机的初始化阶段,然后是App init应用的初始化阶段,再经过App active(warmup)的应用预热时期,在预热一段时间后进入App active(steady)达到性能巅峰期,最后应用结束完成整个生命周期。

图中VM init与App init就是所谓的冷启动,红色部分的VM虚拟机初始化,这是逃不掉的,蓝色的CL(ClassLoad),这两个已经占用很多时间了,接下来才慢慢的预热再发展。

那么我们如何针对冷启动的根因做一些东西。

比如说我们有一种改良性的技术,在现有的Java的框架和运行模型的里面做一些调整优化,例如App CDS技术,降低冷启动阶段的类加载开销,去削减CL的时间达到整体时间的压缩。

还有一种革新性的技术,静态编译,启动即巅峰。

改良型——EagerAppCDS

积跬步,至千里

CDS(Class Data Sharing)是一个Java已有的技术,允许将一组类预处理为共享归档文件,以便在运行时能够进行内存映射以减少 Java 程序的启动时间,当多个 Java 虚拟机(JVM)共享相同的归档文件时,还可以减少动态内存的占用量,同时减少多个虚拟机在同一个物理或虚拟的机器上运行时的资源占用。

Java 10 在现有的 CDS 功能基础上再次拓展,以允许应用类放置在共享存档中。CDS 特性在原来的 bootstrap 类基础之上,扩展加入了应用类的 CDS (Application Class-Data Sharing) 支持。其原理为:在启动时记录加载类的过程,写入到文本文件中,再次启动时直接读取此启动文本并加载。设想如果应用环境没有大的变化,启动速度就会得到提升。

上图中,Klass是一块内存对象指针,指向被ClassLoader加载到类实例,传统的CDS将这部分内容持久化到磁盘,在下次加载时直接从磁盘读取,但起初这只能支持System Class,不能支持Custom Class,在JDK 8u40后才开始陆续支持。

为此阿里有一套自研的Alibaba CDS,如下图,传统AppCDS中,如果是system class直接根据name匹配,如果是Custom Class就需要扫描Jar包,Jar包本质是一个Zip包,这就需要大量IO操作去加载,性能当然不会好。

这种方案在Custom Class越多的情况下肯定会对性能提升有更好的支持。

os: 在当日美团万亿级别微服务治理的挑战与实践中,曹继光提到了美团在序列化反序列化上做的优化,通过分析,发现部分序列化和反序列化占据整个调用时长的9%左右,提到了在这方面做的一些优化,最后提了一句在多实例间共享内存,来避免序列化与反序列化操作,虽然听起来有点难,但是联想到本次冷启动加速的方向中CDS的操作,能不能直接把对象内存抠出来,进行类似主从同步的操作(误)。

现状

已在阿里云SAE(serverless微服务PaaS)平台应用。

应用启动耗时降低5~45%,提升效果与启动时类加载数量成正比。

其他改进型技术

JWarmup:共享预热后的code cache,减小JIT开销

PGO AOT:增强的AOT技术,改进AOT的代码质量

Class Preinit:类预先初始化,降低运行时初始化类的开销

创新型——Graal VM静态编译技术

Graal VM是基于Java的开源高性能多语言运行平台,拥有高性能低内存占用的优点。

下图是Java编译技术的演进历史,蓝色部分运行在JVM中。

我们的ByteCode字节码在解释执行的过程中,需要由JVM解释执行器边解释边执行,速度上当然最慢。

JIT,实时编译,当函数执行一定次数后就放到C1+C2的编译器中,之后这部分代码就不需要去解释执行了,但编译也是要耗费运行时间,速度也不容乐观。

AOT,先把一部分代码提前由jaotc编译好,在运行时就不需要解释执行这部分代码,但这部分代码在jaotc时拿不到VM runtime。

再激进就是静态编译技术,不再需要JVM,而是SVM提供运行时环境,直接将Bytecode转化为BinaryCode去执行。

  • 静态编译必须遵顼封闭性原则(the closed-world assumption)
  • 所有运行时的信息都必须在编译时可见
  • 两个基本问题
    • 如何确定封闭的边界?
    • 如何处理Java的动态特性?

如何在静态编译时确定运行状态,在C/C++中,数组的大小必须定义为一个常量,本质即编译时可见,对于Java反射调用的类如何去保障编译时可见。

针对反射的情况,Graal VM通过预执行给出了需要反射加载的类与方法,编译时填充到缓冲区RelectionData,并且将反射替换为直接方法调用,在运行时从缓存中查找执行。

一个大前提就是需要预执行去扫描这部分反射调用的对象方法,如果扫不到,就需要自己手动去添加配置。

关于性能报告的可以自己去查看大会PPT。

QCon笔记~《天下武功,唯快不破——面向云原生应用的Java冷启动加速技术》的更多相关文章

  1. CTF---Web入门第十六题 天下武功唯快不破

    天下武功唯快不破分值:10 来源: 北邮天枢战队 难度:易 参与人数:10787人 Get Flag:2264人 答题人数:3373人 解题通过率:67% 看看响应头 格式:CTF{ } 解题链接: ...

  2. 实验吧_天下武功唯快不破&让我进去(哈希长度拓展攻击)

    天下武功唯快不破 第一反应就去抓包,看到返回包的header中有FLAG的值,base64解码后得到下图所示 这就要求我们在请求头中post相应key的值,我直接在burp中尝试了多次都没有用,想起来 ...

  3. 【笔记】如何查看HTTP请求头&&【实验吧】天下武功唯快不破

    打开Chrome浏览器,点击右上角“三”按钮. 点击工具-----再点击开发者工具   找到Network选项框.以百度经验页面为例,点击任务选框来查看网络请求流   在Network框内会有所有的请 ...

  4. 【实验吧】CTF_Web_天下武功唯快不破

    打开链接"http://ctf5.shiyanbar.com/web/10/10.php",从页面内容未发现明显信息,查看源代码发现"please post what y ...

  5. 实验吧--web--天下武功唯快不破

    ---恢复内容开始--- 英文翻译过来嘛,就是:天下武功无快不破嘛.(出题者还是挺切题的) 看看前端源码: 注意这里 please post what you find with parameter: ...

  6. web-天下武功唯快不破

    没有武术是不可摧毁的,而最快的速度是获得长期成功的唯一途径.>>>>>> ----你必须尽可能快地做到这一点!---- <<<<<&l ...

  7. 实验吧-web-天下武功唯快不破(Python中byte和str的转换)

    题目:看看响应头 打开网站,既然已经提示我们看响应头了,那我们就看看呗(习惯bp,也可直接F12查看) 可以看到,响应头部分有个FLAG,而且有提示:please post what you find ...

  8. Redis 核心篇:唯快不破的秘密

    天下武功,无坚不摧,唯快不破! 学习一个技术,通常只接触了零散的技术点,没有在脑海里建立一个完整的知识框架和架构体系,没有系统观.这样会很吃力,而且会出现一看好像自己会,过后就忘记,一脸懵逼. 跟着「 ...

  9. 面向云原生的混沌工程工具-ChaosBlade

    作者 | 肖长军(穹谷)阿里云智能事业群技术专家   导读:随着云原生系统的演进,如何保障系统的稳定性受到很大的挑战,混沌工程通过反脆弱思想,对系统注入故障,提前发现系统问题,提升系统的容错能力.Ch ...

随机推荐

  1. JavaScript设计模式(二):工厂模式

    工厂模式模式的定义与特点 工厂模式(Factory Pattern)是编程中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式.在工厂模式中,我们在创建对象时不会对 ...

  2. Jsoup-基于Java实现网络爬虫-爬取笔趣阁小说

    注意!仅供学习交流使用,请勿用在歪门邪道的地方!技术只是工具!关键在于用途! 今天接触了一款有意思的框架,作用是网络爬虫,他可以像操作JS一样对网页内容进行提取 初体验Jsoup <!-- Ma ...

  3. (7)MySQL进阶篇SQL优化(InnoDB锁-事务隔离级别 )

    1.概述 在我们在学习InnoDB锁知识点之前,我觉得有必要让大家了解它的背景知识,因为这样才能让我们更系统地学习好它.InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION ...

  4. PAT归纳总结——关于C++输入输出格式问题的一些总结

    自从使用了C++就不再想使用C语言来刷题了,C++便捷的输入输出方式,以及一些STL库函数的使用都要比使用C语言方便的多.但是使用的时候还有一些需要注意的地方,在这篇博客中写一下.(更好的教程可以参看 ...

  5. 1002 A+B for Polynomials (25分)

    This time, you are supposed to find A+B where A and B are two polynomials. Input Specification: Each ...

  6. ASP.NET Core五种Filter

    Authorization Filter Authorization是五种Filter中优先级最高的,通常用于验证Request合不合法,不合法后面就直接跳过. 权限控制器过滤器,可以通过Authon ...

  7. Android动态调试so库JNI_Onload函数-----基于IDA实现

    之前看过吾爱破解论坛一个关于Android'逆向动态调试的经验总结帖,那个帖子写的很好,对Android的脱壳和破解很有帮助,之前我们老师在上课的时候也讲过集中调试的方法,但是现在不太实用.对吾爱破解 ...

  8. Windows API初练手 -- 疯狂写文件代码

    警告:恶作剧软件,慎用!仅供初学者研究代码所用!!! 提示:默认文件创建目录在"D:\test",如果需要使用的话请自行更改目录. 1. Windows API 版本 (调用系统函 ...

  9. Day003 +和字符串使用的问题

    先看一段代码 int a=10; int b=20; System.out.println(""+a+b); System.out.println(a+b+"" ...

  10. <JVM上篇:内存与垃圾回收篇>04-虚拟机栈

    笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...