quarkus-graalvm 可以救 Java native 一命

查看 71|回复 4
作者:karottc   
前文是这个项目:果然吃内存,一个简单的 Java 程序就占用了 250M 内存
用 quarkus + graalvm 重新了这个项目(顺便学习了下 quarkus, 获益匪浅),功能逻辑全部保持了一致,只是组件根据框架进行了平移(比如 okhttp -> rest-client ).
程序的功能为:
  • 每 10 分钟抓取某个链接的数据
  • 抓取到的内容和 mysql 里面已有的内容作对比
  • 存在就更新,不存在就插入到 mysql 中
  • 每天早上 10 点发送一个企业微信通知
  • 提供一个 rest 接口,上面的功能,可以通过定时触发,也可以通过接口手动触发(保留为了调试和验证程序情况,稳定之后几乎不会调用)。
  • 使用 cdi ( springboot 里面叫 AOP ,quarkus 里面叫 cdi ),把上面 rest 请求记录到日志中。
  • 为了保持一致,日志格式内容都和之前的 springboot 项目保持了一致。

    这就是这个程序的所有功能,这版用到的组件和框架为 quarkus + gson + mybaits + jdbc + quarkus-rest-clint(发送网络请求) + jboss(quarkus 的默认日志)
    编译环境:linux-x86-64, graalvm-21.(社区版),编译之后的二进制大小是 100M 。编译耗时大概十几分钟。
    openjdk version "21.0.2" 2024-01-16
    OpenJDK Runtime Environment GraalVM CE 21.0.2+13.1 (build 21.0.2+13-jvmci-23.1-b30)
    OpenJDK 64-Bit Server VM GraalVM CE 21.0.2+13.1 (build 21.0.2+13-jvmci-23.1-b30, mixed mode, sharing)
    启动之后,占用 90M 内存,然后我调用了好几次 rest 请求,内存涨到了 120M ,过了一天程序稳定运行之后内存占用在 40-50M 左右。
    虽然和我预期的 20M 内存有差距,但是已经比较满意了。虽然量起来了,内存占用一样会升高,但是没量了会把内存还给操作系统。quarkus 的启动速度确实快,毫秒级。
    这次项目的意义,在于让我学会了 quarkus,(除了上面的项目,我还用 quarkus-picocli 写了个命令行工具,也很不错) 不愧是自古评论出人才。
    此外,我用 python 实现了上面项目的核心部分,稳定之后内存占用 20M 。
    最后,吹一下 quarkus, 在 native 这块很强,和 graalvm 的集成度非常高,比如反射问题单纯用 graalvm 需要繁琐的配置文件,在 quarkus 里面用一个注解就行了,方便很多。
    缺点就是编译略慢,而且需要高配机器,配置越高,编译越快。
    单纯的 graalvm 还是非常不行, 2024 年,graalvm native image 仍较为勉强 这个帖子也说了,但是和 quarkus 搭配一下就很不错了。
  • GogoGo666   
    这种情况还是换 go 吧,不管是编译后的二进制大小,编译耗时,内存占用,都比 java 强太多了
    yazinnnn0   
    自己玩没问题, 在大规模生产环境中使用会变得不幸, 除非你在红帽工作, 身边都是 quarkus 贡献者

    karottc
    OP
      
    @GogoGo666 认真学了一段时间,然后没有工作环境持续,并且也不是很喜欢,然后就放弃了。
    wssy001   
    无论是 springboot 还是 Quarkus 在改造成 Native Image 项目中 都会面临重构轮子的窘境
    JVM 环境中,开发者 Google 到一个好轮子可以拿来直接用,而在 Native Image 中,开发者不得不考虑该怎么用原生的方式“曲线救国”
    这是我这几年玩 GraalVM Native Image 的心得,最后得出一个结论:鉴于目前 Native Image 的生态,我觉得把项目用 go 重构的代价要比改成 Native Image 低不少(时间+精力方面)
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部