• 中文
    • English
  • 注册
  • 查看作者
  • GraalVM 22.2添加库配置仓库功能

    GraalVM以将
    编译成较小的原生可执行文件而闻名,这些原生可执行文件的启动速度要比传统Java程序快得多。Oracle Labs发布的
    通过引入针对Java库的配置仓库解决了一个长期存在的痛点问题。原生Java编译会使用更少的内存,GraalVM分发版在Apple Silicon运行得更好,并且文件体积更小。

    原生编译使Java在云中更具竞争力。如今,Quarkus、Micronaut和Helidon都支持在生产环境中使用GraalVM。Spring 6和Spring Boot 3计划在今年年底实现这一目标。InfoQ针对这个话题,曾经发布过一个

    GraalVM为什么需要配置仓库呢?与常规的Java不同,原生Java的可执行文件在运行时无法动态加载新的代码。这就是为什么GraalVM的原生编译器Native Image需要知道运行时用到的所有类、方法和字段的原因(“封闭性假设”)。Native Image通过可达性分析能够自动进行探测。但是,鉴于Java的动态特性,比如反射和代理,会隐藏一些代码,从而导致其无法被分析到。使用这些动态特性的应用和库必须向Native Image提供配置线索(hint),否则它们根本无法在原生Java中运行。

    到现在为止,Java开发人员必须为那些还没有提供GraalVM支持的Java框架提供这些线索信息。
    有望消除这一负担:GraalVM 22.2会从这个新的中央仓库中读取线索信息(已经被重命名为“可达性元数据”)。它来源于GraalVM、Micronaut、Spring Boot和Quarkus的协作,并且欢迎大家为其

    现在,原生镜像在编译过程中使用的RAM会更少。例如,构建Spring 
    应用仅需要使用2GB。内存受限的CI环境或云服务,如GitHub Actions,将会在这种资源节省中收益。

    Native Image不仅可以编译像Java、Scala和
    这样的JVM语言,还能编译

    、Ruby、R和WebAssembly。在这个版本中,Python有了一个实验性的字节码解释器,启动速度更快,性能也更好。JavaScript与其他语言的对象之间的互操作性也得到了改善。

    GraalVM发行版的文件更小了,因为它更加模块化,不再包含JavaScript和LLVM的运行时以及VisualVM。在Linux上,这使得Java 17 GraalVM发行版的大小减少了42%,从431 MB减少到了251 MB。

    随着22.2版本的发布,原生的Java可执行文件可以将内存堆转储到文件中,就像传统的Java应用那样。这可以通过
    实现:调用运行时API、向应用发送OS信号或者在启动后立即进行(这种方式同时会退出应用)。该版本还包含编译过程中更快的逃逸分析、在Linux上改善了调试功能并且为长时间的循环提供了实验性的strip挖掘优化(strip挖掘会将一个长时间运行的循环转换为一个嵌套的循环,其中内部主体运行的时间是有限的。这样就可以把安全点放在外循环中,减少安全点轮询的开销。——译者注)。

    现在,商业的GraalVM企业版提供了对Apple Silicon的实验性支持,在今年4月发布的GraalVM 22.1中,社区版就包含了
    。其他GralVM组件现在也能在这两个版本中支持Apple Silicon,如JavaScript、LLVM、Ruby、Java on Truffle VM和WebAssembly。企业版还可以在原生可执行文件中包含CycloneDX格式的

    OpenJDK管理着Java语言的演进。但GraalVM不是OpenJDK的一部分,因为它属于Oracle Labs。不过,由于OpenJDK在 Leyden项目中
    ,GraalVM仍将是未来几年内原生Java的唯一可选方案。

    作者简介:

    作为一名全栈 Java 开发人员,Karsten Silz 在欧洲和美国工作了23年。2004年,他在美国合伙创立了一家提供软件产品的初创公司。Karsten领导了13年的产品开发,并在公司成功出售后离开。自2017年以来,他一直在德国和英国做承包商(Spring Boot、Angular、Flutter)。2020年,他作为CTO共同创立了SaaS初创公司“Your Home in Good Hands”。

    原文链接:

  • 0
  • 0
  • 0
  • 225
  • 请登录之后再进行评论

    登录
  • 任务
  • 实时动态
  • 发布
  • 单栏布局 侧栏位置: