据说是性能追赶 go,内存省一半。
1
Itoktsnhc 2023-04-06 10:15:03 +08:00 7
Java 性能赶上 go 那不是倒退?
|
2
nekoneko 2023-04-06 10:17:55 +08:00
听别人说还是会出现一些问题的
|
4
Huelse 2023-04-06 10:22:06 +08:00
想编译个 static image 结果麻烦的要死,整了一堆库和源文件
|
5
Akitora 2023-04-06 10:22:30 +08:00 via Android
之前 Freemarker 都还有兼容问题,不知道现在有没有好点了
|
6
oldshensheep 2023-04-06 10:26:46 +08:00
GraalVM 的生态现在基本上是刚刚起步,用的应该不多。
GraalVM 也不是和 go 比性能,因为不用 GraalVM ,Java 性能也比 go 高(就是内存占用比较大),现在内存和不要钱一样,不是什么大问题。 GraalVM 一般用来搞 Serverless ,还有减少启动时间。 如果你编译成 Native ,性能一般会下降的。 因为不是所有的库都兼容 GraalVM ,现在编译一般要 Collect Metadata with the Tracing Agent ,要写一个覆盖所有代码路径的一个测试才能保证编译出来的没问题。 |
7
Itoktsnhc 2023-04-06 10:31:40 +08:00
Java 的痛点还是启动时间(预热),和内存占用。
这几个在大的单体应用上都还可,但如果是在类 Serverless 或者容器内部去运行就会很难受,我们内部的 Java 项目在打包 Image 是 go 项目的 4x 体积的基础上,运行内存是 go 的 6x ,实现了可能 2/3 的功能点。除开这些 Java 的绝对性能并不差。 |
8
litchinn 2023-04-06 10:32:34 +08:00
在这个时间节点问,我首先假定你指的在 spring boot 3 中使用 graalvm ,打包原生镜像
小工具用没啥问题,主流后端项目目前还上不了 比如国内比较火的 mybatis 目前还不支持 AOT ,打不了包 再如序列化 json 还需要显示声明 实际使用中,它的启动速度确实是优势,内存占用我这边目前没搞过大型项目,但应该是能省的 编译速度是真的拉,这编译速度我觉得比 rust 编译还慢 因此感觉想在大型 web 项目中使用应该还要一段时间,在一些特殊场景中是可以选择的,但是这种场景下可能使用 rust 之类的其他语言更好(只会 java 除外) 大型项目目前想走原生路子首选应该还是 quarkus ,这个我了解不多就不说了 |
9
yazinnnn 2023-04-06 10:39:28 +08:00
热知识
1. jit 性能比 aot 性能好 2. java 性能和 go 性能一致 |
10
Narcissu5 2023-04-06 10:50:56 +08:00
java 的杀手锏之一就是开放的元空间,可以动态加载类,tomcat 之类都有赖于此,代价就是 AOT 编译复杂。每个语言都有擅长的地方,我觉得这个领域上 java 不太可能超过 go
|
11
cubecube 2023-04-06 11:43:25 +08:00
@oldshensheep 我记得看文档,它编译时检测到不支持的情况下,会回退到正常的 jvm 状态,也挺高级的
|
12
renyijiu 2023-04-06 11:51:41 +08:00
我们生产用的是 quarkus ,以前用的 micronaut ,都支持 graalvm ,但实际使用还是比较麻烦的,因为对于你的依赖还是有要求的,随意引依赖很容易就不支持编译报错了,另外就是编译真的耗时和吃资源🤣
|
13
bootvue 2023-04-06 12:04:36 +08:00
是的 graalvm 适合 java 深度靠向云原生 服务启动嗖的飞起来 对 java 本身性能导致没有什么本质性的改变
|
14
yy306525121 OP 感谢大佬的回复,感觉学到了很多😁
|
15
yy306525121 OP |
16
yy306525121 OP |
17
layxy 2023-04-07 09:22:25 +08:00
go 缺少动态加载能力,java 使用 GraalVM 会失去动态加载能力而且性能反而会下降,唯一的优势就是启动变快了
|
18
ZhiyuanLin 2023-04-07 09:58:35 +08:00
GraalVM 让 Java 能适合写云函数,低内存占用,秒启动,单 binary 不用和 JVM 一起部署。
|
19
yy306525121 OP |