GraalVM(云原生时代的Java)和IoT在边缘侧落地与实践

这篇具有很好参考价值的文章主要介绍了GraalVM(云原生时代的Java)和IoT在边缘侧落地与实践。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

环顾四周,皆是对手!

  • 云时代的掉队者,由于Java启动的高延时、对资源的高占用、导致在Serverless及FaaS架构下力不从心,在越来越流行的边缘计算、IoT方向上也是难觅踪影;
  • Java语言在业务服务开发中孤独求败,但在系统级应用领域几乎是C、C++、搅局者Go、黑天鹅Rust的天下;
  • 移动应用、敏捷应用的追随者,移动应用中Android逐步去Java,前端又是JS的世界,敏捷开发方面前有Ruby、Python后有NodeJS;

GraalVM(云原生时代的Java)和IoT在边缘侧落地与实践

此时众多的Javaer会不经意发问:学Java还有未来么?

你可以嫌弃Java, 但是可以永远相信JVM! 在云原生如日中天、Serverless日渐成熟、新语言百花齐放的当下,跨语言、Native支持、高性能低资源占用的技术必定是其璀璨的明珠,而GraalVM正是这样一个承载了JVM未来,将Java带入下一波技术的弄潮儿。

GraalVM - 云原生时代的Java

“一次编写,到处运行“是Java语言的特性,这一重要特性依靠的是JVM虚拟机

在讨论GraalVM之前,我们先聊下Java代码是怎么运行的?

从硬件视角来看,Java字节码无法直接执行。因此,Java虚拟机需要将字节码翻译成机器码。

GraalVM(云原生时代的Java)和IoT在边缘侧落地与实践

从虚拟机视角来看,执行Java代码首先需要将它编译而成的 class 文件加载到 Java 虚拟机中。加载后的 Java 类会被存放于方法区(Method Area)中。实际运行时,虚拟机会执行方法区内的代码。Java 虚拟机同样也在内存中划分出堆和栈来存储运行时数据。

不同的是,Java 虚拟机会将栈细分为面向 Java 方法的 Java 方法栈,面向本地方法(用 C++ 写的 native 方法)的本地方法栈,以及存放各个线程执行位置的 PC 寄存器。

GraalVM(云原生时代的Java)和IoT在边缘侧落地与实践

在运行过程中,每当调用进入一个 Java 方法,Java 虚拟机会在当前线程的 Java 方法栈中生成一个栈帧,用以存放局部变量以及字节码的操作数。这个栈帧的大小是提前计算好的,而且 Java 虚拟机不要求栈帧在内存空间里连续分布。

当退出当前执行的方法时,不管是正常返回还是异常返回,Java 虚拟机均会弹出当前线程的当前栈帧,并将之舍弃。

GraalVM带来哪些神奇的黑魔法🧙‍♂️

  1. 更快、更轻量化的应用

    GraalVM的高性能JIT编译器可以生成优化的本地机器代码,由于采用了先进的编译器优化和积极复杂的内联技术,运行速度更快,产生的垃圾更少,使用的CPU更少。最终的结果是应用程序运行速度更快,消耗的资源更少,从而降低了云和基础设施的成本。

  2. Ahead-Of-Time(AOT)提前编译技术

    AOT 提前编译,是相对于即时编译而言的。AOT在运行过程中耗费 CPU 资源来进行即时编译,而程序也能够在启动的瞬间就达到理想的性能。例如 C 和 C++语言采用的是AOT静态编译,直接将代码转换成机器码执行。而 Java 一直采用的是解释 + 即时编译技术。

    GraalVM 的 AOT 编译实际上是借助了 SubstrateVM 编译框架,可以将 SubstrateVM 理解为一个内嵌精简版的 JVM,包含异常处理,同步,线程管理,内存管理(垃圾回收)和 JNI 等组件。

    SubstrateVM 的启动时间非常短,内存开销非常少。用这种方式编译出的 Java 程序的执行时间可与C语言持平。

  3. 语言互操作性

    Graal VM 被官方称为“Universal VM”和“Polyglot VM”,这是一个在 HotSpot 虚拟机基础上增强而成的跨语言全栈虚拟机,可以作为“任何语言”的运行平台使用,这里“任何语言”包括了 Java、Scala、Groovy、Kotlin 等基于 Java 虚拟机之上的语言,还包括了 C、C++、Rust 等基于 LLVM 的语言,同时支持其他像 JavaScript、Ruby、Python 和 R 语言等等。Graal VM 可以无额外开销地混合使用这些编程语言,支持不同语言中混用对方的接口和对象,也能够支持这些语言使用已经编写好的本地库文件。

GraalVM在IoT边缘侧实现落地,效果显著!

1、安装无需JVM环境,30000行项目安装仅需16M内存占用,可在mac、linux-arm64、windows和树莓派等硬件环境上运行;

2、项目启动时间节省99%, 仅需10ms!享受极速的软件体验;

安装

GraalVM(云原生时代的Java)和IoT在边缘侧落地与实践

GraalVM在 SDKMAN上有多个版本,可通过sdk list java进行查看,我这里使用的是22.2 社区版本

安装SDKMAN!, 请看安装文档

sdk install java 22.2.r11-grl

上述GraalVM安装完成后,需要Native Image组件,使用下述命令行进行安装:

Native Image安装

gu install native-image

Maven项目设置

详细graalvm-maven-plugin使用简介见:https://graalvm.github.io/native-build-tools/latest/maven-plugin-quickstart.html

<profile>
            <id>native</id>
            <activation>
                <property>
                    <name>native</name>
                </property>
            </activation>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.graalvm.buildtools</groupId>
                        <artifactId>native-maven-plugin</artifactId>
                        <version>${graalvm-buildtools.version}</version>
                        <extensions>true</extensions>
                        <executions>
                            <execution>
                                <id>build-native</id>
                                <goals>
                                    <goal>compile-no-fork</goal>
                                </goals>
                                <phase>package</phase>
                            </execution>
                        </executions>
                        <configuration>
                            <skip>false</skip>
                            <imageName>${appName}</imageName>
                            <requiredVersion>${graalvm.version}</requiredVersion>
                            <mainClass>${mainClass}</mainClass>
                            <buildArgs>
                                <arg>--no-fallback</arg>
                                <arg>-Dfile.encoding=UTF-8</arg>
                                <arg>-H:-CheckToolchain</arg>
                                <arg>-H:+ReportExceptionStackTraces</arg>
                            </buildArgs>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>

当然GraalVM的 AOT提前编译技术也不是完全没有缺点,其对于多语言、反射和字节码动态加载技术需要相对繁琐的配置。

GraalVM(云原生时代的Java)和IoT在边缘侧落地与实践

src/main/resources文件夹下有

  • native-image.properties //native image配置信息文件
  • reflection-config.json //native 需要反射的类配置文件

具体配置信息详情见: https://www.graalvm.org/22.0/reference-manual/native-image/Reflection/#manual-configuration

native-image.properties信息如下:

Args = -H:ReflectionConfigurationResources=${.}/reflection-config.json \
       -H:IncludeLocales=zh,en,de,fr \
       --initialize-at-run-time=io.netty.buffer.AbstractReferenceCountedByteBuf \
       --initialize-at-run-time=io.netty.buffer.ByteBufAllocator \
       --initialize-at-run-time=io.netty.buffer.ByteBufUtil \
       --initialize-at-run-time=io.netty.buffer.ByteBufUtil$HexUtil \
       --initialize-at-run-time=io.netty.buffer.PooledByteBufAllocator \
       --initialize-at-run-time=io.netty.buffer.UnpooledHeapByteBuf \
       --initialize-at-run-time=io.netty.buffer.UnreleasableByteBuf \
       --initialize-at-run-time=io.netty.util.AbstractReferenceCounted \
       --initialize-at-run-time=io.netty.util.internal.ThreadLocalRandom \
       --initialize-at-run-time=io.netty.util.concurrent.GlobalEventExecutor \
       --initialize-at-run-time=io.netty.util.concurrent.ImmediateEventExecutor \
       --initialize-at-run-time=io.netty.util.concurrent.ScheduledFutureTask \
       -Dio.netty.noUnsafe=true \
       -Dio.netty.leakDetection.level=DISABLED

reflection-config.json信息如下:

[
  {
    "name": "io.netty.channel.socket.nio.NioSocketChannel",
    "methods": [
      { "name": "<init>", "parameterTypes": [] }
    ]
  },
......
{
    "name" : "iot.technology.client.toolkit.nb.service.mobile.domain.action.data.MobCachedCommandResponse",
    "allDeclaredMethods" : true,
    "allPublicMethods" : true,
    "allDeclaredClasses" : true,
    "allPublicClasses" : true,
    "allDeclaredConstructors" : true,
    "allPublicConstructors" : true
  }
]

上述信息配置完成,我们在项目根目录下执行以下命令:

mvn clean package -Pnative

会见到下面的日志命令输出:

[INFO] --- native-maven-plugin:0.9.17:compile-no-fork (build-native) @ toolkit-app ---
[INFO] Found GraalVM installation from JAVA_HOME variable.
......
========================================================================================================================
GraalVM Native Image: Generating 'toolkit' (executable)...
========================================================================================================================
[1/7] Initializing...                                                                                    (9.2s @ 0.20GB)
 Version info: 'GraalVM 22.2.0 Java 17 CE'
 Java version info: '17.0.4+8-jvmci-22.2-b06'
 C compiler: cc (null, null, 0.0.0)
 Garbage collector: Serial GC
 1 user-specific feature(s)
 - org.graalvm.home.HomeFinderFeature: Finds GraalVM paths and its version number
[2/7] Performing analysis...  [*********]                                                               (45.3s @ 2.77GB)
  11,123 (90.04%) of 12,354 classes reachable
  18,642 (59.17%) of 31,506 fields reachable
  57,906 (57.83%) of 100,137 methods reachable
     524 classes,   194 fields, and 2,046 methods registered for reflection
      79 classes,   196 fields, and   136 methods registered for JNI access
       5 native libraries: -framework CoreServices, -framework Foundation, dl, pthread, z
[3/7] Building universe...                                                                               (4.7s @ 1.45GB)
[4/7] Parsing methods...      [**]                                                                       (3.6s @ 1.88GB)
[5/7] Inlining methods...     [***]                                                                      (2.2s @ 3.94GB)
[6/7] Compiling methods...    [*****]                                                                   (31.6s @ 4.19GB)
[7/7] Creating image...                                                                                  (5.6s @ 2.77GB)
  25.79MB (49.67%) for code area:    37,581 compilation units
  25.84MB (49.78%) for image heap:  290,531 objects and 175 resources
 292.13KB ( 0.55%) for other data
  51.92MB in total
------------------------------------------------------------------------------------------------------------------------
Top 10 packages in code area:                               Top 10 object types in image heap:
   1.65MB sun.security.ssl                                     5.53MB byte[] for code metadata
1021.89KB java.util                                            2.78MB java.lang.String
 919.87KB picocli                                              2.73MB java.lang.Class
 731.85KB com.sun.crypto.provider                              2.62MB byte[] for general heap data
 565.20KB java.lang.invoke                                     2.42MB byte[] for java.lang.String
 518.23KB java.lang                                            1.46MB byte[] for embedded resources
 504.26KB org.jline.reader.impl                              955.88KB com.oracle.svm.core.hub.DynamicHubCompanion
 476.05KB c.s.org.apache.xerces.internal.impl.xs.traversers  663.69KB byte[] for reflection metadata
 458.58KB sun.security.x509                                  623.30KB java.util.HashMap$Node
 438.98KB com.sun.org.apache.xerces.internal.impl            580.77KB java.lang.String[]
  18.36MB for 389 more packages                                4.51MB for 2478 more object types
------------------------------------------------------------------------------------------------------------------------
                        6.3s (5.7% of total time) in 32 GCs | Peak RSS: 5.93GB | CPU load: 5.50
------------------------------------------------------------------------------------------------------------------------
Produced artifacts:
......

GraalVM带来的惊人效果

启动时间

启动时间代码添加:

public static void main(String[] args) {
        long begin = System.currentTimeMillis();
        ......
        try {
            ......
            long end = System.currentTimeMillis();
            long runTime = end - begin;
            System.out.println("startUp cost runTime: " + runTime);
            ......
        } finally {
            ......
        }
    }

使用IDEA启动代码,启动时间如下:

GraalVM(云原生时代的Java)和IoT在边缘侧落地与实践

AOT提前编译后native-image启动时间:

➜  target git:(develop-v0.6.6) ✗ ./toolkit
......
startUp cost runTime: 11

占用内存的效果

项目代码统计:

GraalVM(云原生时代的Java)和IoT在边缘侧落地与实践

编译后可在linux、树莓派、mac系统和windows系统可运行的镜像;

GraalVM(云原生时代的Java)和IoT在边缘侧落地与实践

上述的项目配置和落地实践项目见: https://github.com/IoT-Technology/IoT-Toolkit

结束语

GraalVM对于JVM的开发人员来说,无疑是个非常好的消息。但是留给JVM的时间真的不多了。文章来源地址https://www.toymoban.com/news/detail-424596.html

到了这里,关于GraalVM(云原生时代的Java)和IoT在边缘侧落地与实践的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot3 GraalVM 原生镜像打包 搭建云原生环境

    java发布到如今,已经过去几十年,如今微服务、云原生逐渐成为了主流,java原本的很多优势不再重要,而启动慢,耗内存等的缺点也越来越被放大. java在新发布的很多相关技术中也做出了很多改变 其中SpringBoot3结合GraalVM,可以直接将java项目打包成原生可执行文件,提升运行速度并大

    2024年02月06日
    浏览(37)
  • 国内最大规模上云实践 | 鹅厂如何在云原生2.0时代“挖呀挖”?

    👉 腾小云导读 2022 年 10 月,腾讯自研业务产品全面完成云原生上云。自研业务产品云上规模已突破 5000w CPU,借助云原生的技术优势,全面提升了腾讯自研业务产品的运营效率,在此过程中我们也对腾讯云产品进行了打磨和验证。无论是在业务场景、稳定性要求、运维效率等

    2024年02月14日
    浏览(30)
  • 云原生✖️ AI 时代的微服务架构最佳实践—— CloudWeGo 技术沙龙·北京站报名开启

    CloudWeGo 开源两年多以来,社区发展迅速,生态日益丰富,落地企业用户已超过 40 家,涵盖 AI、电商、金融、游戏 等多个行业。同时,随着云原生技术和 AI 技术的持续蓬勃发展,我们发现企业用户也面临着越来越多性能、成本和稳定性方面的挑战,系统需要支持弹性伸缩和潮

    2024年03月25日
    浏览(40)
  • 【腾讯云 TDSQL-C Serverless 产品测评】- 云原生时代的TDSQL-C MySQL数据库技术实践

    “腾讯云 TDSQL-C 产品测评活动”是由腾讯云联合 CSDN 推出的针对数据库产品测评及产品体验活动,本次活动主要面向 TDSQL-C Serverless版本,初步的产品体验或针对TDSQL-C产品的自动弹性能力、自动启停能力、兼容性、安全、并发、可靠性等多方面的产品测评。 有幸在CSDN的推广上

    2024年02月11日
    浏览(36)
  • 使用Graalvm+Swing搓了个原生桌面应用的轮子:文件差异对比工具,附轮子源码

    1、DFDiff介绍 当前已实现的功能比较两个文件夹内的文件差异,已支持文件差异对比。 2、软件架构 软件架构说明 开发环境是在OpenJDK17,UI使用的是Swing + SwingX扩展控件,使用Graalvm编译为原生应用。 文件列表使用的Swingx组件的JXTreeTable。 文件差异对比使用的Swingx组件的JXTabl

    2024年02月08日
    浏览(32)
  • 【Quarkus技术系列】「云原生架构体系」在云原生时代下的Java“拯救者”是Quarkus,那云原生是什么呢?

    云原生时代下的Java\\\"拯救者\\\" 在云原生时代,其实Java程序是有很大的劣势的,以最流行的spring boot/spring cloud微服务框架为例,启动一个已经优化好,很多bean需要lazy load的application至少需要3-4秒时间,内存需要几百M,业务逻辑稍微复杂一点点,没有1G以上的内存是很难满足业务

    2024年02月13日
    浏览(34)
  • 数据智能的产业化落地:边缘计算的优势和应用

    随着数字化时代的到来,数据已经成为企业和组织中最重要的资产之一。然而,随着数据量的增长和数据类型的多样化,传统的数据处理方式已经无法满足人们对数据分析和决策的需求。边缘计算作为一种新兴的计算模式,可以在数据产生的过程中进行处理,从而降低数据处

    2024年02月05日
    浏览(34)
  • 物联网时代25大开源IoT框架

    相当长一段时间以来,互联网一直被用来连接人类并简化生活,这是21世纪初的启示。今天,我们将讨论各种物联网框架 —— 现在,我们正在进入一个基于互联网技术的新世界,该世界不仅连接人,而且还连接事物。因此,我们称其为物联网 (internet of things , IoT) 。 从人联网

    2024年02月04日
    浏览(34)
  • 使用 Amazon ECS Anywhere 在边缘部署 Amazon IoT Greengrass

    1.概述 亚马逊云科技提供了完备的IoT服务能力,涵盖设备服务、连接和控制服务以及云端分析服务,是快速构建安全可靠、可扩展的 IoT 平台的常见选择。Amazon IoT Greengrass 边缘运行时和云服务,可帮助您在设备上构建、部署和管理 IoT 应用。Amazon ECS Anywhere提供的混合云容器服

    2024年02月14日
    浏览(30)
  • 对话人工智能 |新时代AI如何“落地“

    前言: Comate代码助手推出,现场生成了贪吃蛇游戏,我们距离AI自动编程还有多远? 在过去的几十年里,AI的发展取得了显著的进展,尤其是在机器学习和深度学习领域。然而,将AI应用于自动编程这一复杂任务依然面临着挑战。 AI自动编程的实现需要解决多个难题。首先,

    2024年02月08日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包