GraalVM 助力 Java 进入函数即服务时代

本文涉及的产品
函数计算FC,每月15万CU 3个月
简介: FaaS - 无服务器计算,亦即函数即服务,英文 Fuction as a Service,其目标是希望应用不用一直运行着,只有当有请求来的时候,才快速启动这个应用,然后请求一走就停掉这个应用。换句话说,不让应用在背景程式持续的启动着,而是有需要的时候才开启。

缘起


FaaS - 无服务器计算,亦即函数即服务,英文 Fuction as a Service,其目标是希望应用不用一直运行着,只有当有请求来的时候,才快速启动这个应用,然后请求一走就停掉这个应用。换句话说,不让应用在背景程式持续的启动着,而是有需要的时候才开

启。


这就要求应用要有快速启动,快速停止的能力。

相对庞大的 Jvm 启动时间,加上巨型的 Spring Framework, 很多应用启动动辄分钟级,实现 FaaS 实在是痴心妄想。相比之下,PHP还真是最好的语言,因为 PHP的启动模型本质上就是 FaaS, 你哪哈... 别说了。


话说 Spring 当年就是为了简化 J2EE 的庞杂而出生的,如今也变成了自己讨厌的样子...

软件的问题由软件来解决, Any problem in computer science can be solved with another layer of indirection. 没有什么问题是口罩和护垫解决不了的,如果是,就再加一层。

GraalVM 就是新出现的那一层。

SU_827`1SIQZN[JWGUY{10J.png

从上面看,这一层增加了对多语言的支持,Truffle Framework 支持Ruby, R, Js编译到JVM,再嫁接一下LLVM,那传统的C/C++等也可以统统编译了。话说 C/C++本来就是直接编译成原生的,这回 C -> LLVM -> GrallVM -> 原生, 你品,你细品,究竟折腾个啥。


所以说加层唯一解决不了的问题是层过多的问题:...except for the problem of too many layers of indirection - Kevlin Henney.

从下面看,GraalVM 可以将 .class 编译成原生代码,去掉了包中不使用的代码,大大提高了启动速度,运行速度据称也大大提高。


人生总是不要脸的轮回。当年微软用Visual J++把 Java 编成原生,速度超快,引来的是与Sun的官司战。Sun被Oracle收购,Oracle搞来搞去又走上了这条螺旋下降的道路。

这样,替换VM直接代来了效率提升,带来了和加内存升级CPU一样的效果。

更多原理上的内容可以参考这篇, 写得很详细。只是少分部内容有点过时了。


实操


下载GraalVM

https://www.graalvm.org/downl...

完整地用类用例可以看看这里,有很多:

git clone https://github.com/quarkusio/quarkus-quickstarts.git


Quarkus 框架结合 GraalVM 的各类应用。

下面我们只看几个最简单的 GraalVM 用例.

// HelloWorld.java
public class HelloWorld {
  public static void main(String[] args) {
    System.out.println("Hello, World!");
  }
}
$ native-image HelloWorld
[helloworld:29104]    classlist:     878.53 ms,  0.96 GB
[helloworld:29104]        (cap):   5,001.41 ms,  0.96 GB
[helloworld:29104]        setup:   7,970.43 ms,  0.96 GB
[helloworld:29104]     (clinit):     136.83 ms,  1.20 GB
[helloworld:29104]   (typeflow):   3,437.24 ms,  1.20 GB
[helloworld:29104]    (objects):   3,531.34 ms,  1.20 GB
[helloworld:29104]   (features):     194.35 ms,  1.20 GB
[helloworld:29104]     analysis:   7,426.70 ms,  1.20 GB
[helloworld:29104]     universe:     243.17 ms,  1.20 GB
[helloworld:29104]      (parse):     732.66 ms,  1.67 GB
[helloworld:29104]     (inline):   1,048.13 ms,  1.67 GB
[helloworld:29104]    (compile):   4,809.83 ms,  2.29 GB
[helloworld:29104]      compile:   7,051.94 ms,  2.29 GB
[helloworld:29104]        image:     986.33 ms,  2.29 GB
[helloworld:29104]        write:     252.78 ms,  2.29 GB
[helloworld:29104]      [total]:  24,931.40 ms,  2.29 GB

编译一个helloworld为原生代码需要 24 秒, 同时也需要大量的物理内存,最后一列是内存的使用。

运行,原生:

$ time ./helloworld 
Hello, World!
real    0m0.010s
user    0m0.004s
sys    0m0.003s

比较传统方式:

$ time ./helloworld 
Hello, World!
real    0m0.010s
user    0m0.004s
sys    0m0.003s

这个原生的 helloworld 个头也是惊人的:

$ ll
total 15712
-rw-r--r--   1       427 12  8 00:18 HelloWorld.class
-rw-r--r--   1       116 12  8 00:18 HelloWorld.java
-rwxr-xr-x   1   8032816 12  8 00:19 helloworld

足足 8 Mb.

相关实践学习
【AI破次元壁合照】少年白马醉春风,函数计算一键部署AI绘画平台
本次实验基于阿里云函数计算产品能力开发AI绘画平台,可让您实现“破次元壁”与角色合照,为角色换背景效果,用AI绘图技术绘出属于自己的少年江湖。
从 0 入门函数计算
在函数计算的架构中,开发者只需要编写业务代码,并监控业务运行情况就可以了。这将开发者从繁重的运维工作中解放出来,将精力投入到更有意义的开发任务上。
相关文章
|
2月前
|
存储 数据采集 搜索推荐
Java 大视界 -- Java 大数据在智慧文旅旅游景区游客情感分析与服务改进中的应用实践(226)
本篇文章探讨了 Java 大数据在智慧文旅景区中的创新应用,重点分析了如何通过数据采集、情感分析与可视化等技术,挖掘游客情感需求,进而优化景区服务。文章结合实际案例,展示了 Java 在数据处理与智能推荐等方面的强大能力,为文旅行业的智慧化升级提供了可行路径。
Java 大视界 -- Java 大数据在智慧文旅旅游景区游客情感分析与服务改进中的应用实践(226)
|
10天前
|
JSON Java 数据格式
java调用服务报错400
java调用服务报错400
52 6
java调用服务报错400
|
11天前
|
JSON Java 数据格式
java调用服务报错415 Content type ‘application/octet-stream‘ not supported
java调用服务报错415 Content type ‘application/octet-stream‘ not supported
69 6
|
1月前
|
存储 Java Go
对比Java学习Go——函数、集合和OOP
Go语言的函数支持声明与调用,具备多返回值、命名返回值等特性,结合`func`关键字与类型后置语法,使函数定义简洁直观。函数可作为一等公民传递、赋值或作为参数,支持匿名函数与闭包。Go通过组合与接口实现面向对象编程,结构体定义数据,方法定义行为,接口实现多态,体现了Go语言的简洁与高效设计。
|
6月前
|
数据采集 监控 Oracle
GraalVM 24 正式发布阿里巴巴贡献重要特性 —— 支持 Java Agent 插桩
阿里巴巴是 GraalVM 全球顾问委员会的唯一中国代表,阿里云程序语言与编译器团队和可观测团队合作实现了 GraalVM 应用的无侵入可观测能力,并在 ARMS 平台上线了该功能。目前在 GraalVM 24 中发布的是支持 Java agent 的第一步,其余能力将在 GraalVM 的后续版本中陆续发布。
467 22
|
3月前
|
分布式计算 搜索推荐 算法
Java 大视界 -- Java 大数据在智慧养老服务需求分析与个性化服务匹配中的应用(186)
本篇文章探讨了Java大数据技术在智慧养老服务需求分析与个性化服务匹配中的应用。通过整合老年人健康数据与行为数据,结合机器学习与推荐算法,实现对老年人健康风险的预测及个性化服务推荐,提升养老服务的智能化与精准化水平,助力智慧养老高质量发展。
|
Java Maven Windows
使用Java创建集成JACOB的HTTP服务
本文介绍了如何在Java中创建一个集成JACOB的HTTP服务,使Java应用能够调用Windows的COM组件。文章详细讲解了环境配置、动态加载JACOB DLL、创建HTTP服务器、实现IP白名单及处理HTTP请求的具体步骤,帮助读者实现Java应用与Windows系统的交互。作者拥有23年编程经验,文章来源于稀土掘金。著作权归作者所有,商业转载需授权。
279 2
使用Java创建集成JACOB的HTTP服务
|
Java
利用GraalVM将java文件变成exe可执行文件
这篇文章简明地介绍了如何使用GraalVM将一个简单的Java程序编译成exe可执行文件,首先通过javac命令编译Java文件生成class文件,然后使用native-image命令将class文件转换成独立的exe文件,并展示了如何运行这个exe文件。
356 0
利用GraalVM将java文件变成exe可执行文件
|
8月前
|
网络协议 Java Shell
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
448 7

热门文章

最新文章