还在用JVM跑你的Java代码吗?太慢了,试试Oracle的GraalVM吧

news2025/1/14 1:01:29

前言

对于Java开发者们来说,几乎每天都在和JVM打交道,然而JVM即将过时了。那些对新技术保持敏锐洞察力的开发者,可能已经在生产环境中部署GraalVM生成的二进制程序了,小伙伴们,你们已经用起来了吗?

GraalVM有何魅力?

图片

GraalVM是由Oracle官方大力发展和想要推广的下一代高性能多语言虚拟机,目前很多框架已支持 GraalVM ,比如Spring 。

GraalVM 的核心优势在于其 Native Image技术,它能够将Java代码直接编译成独立的二进制可执行文件,通过使用即时编译器(JIT)和提前编译器(Ahead-Of-Time, AOT)优化代码执行提高性能,具有以下高级特性:

  • 低CPU和内存使用率:GraalVM 具有高效的垃圾回收机制,可以减少内存使用并提高应用性能。

  • 多语言支持:GraalVM可以运行JavaScript、Python、Ruby等多种其他语言,从而扩展了其应用范围。

  • 极高的安全性:提供了更高级别的安全性,可以更好地保护应用程序免受攻击和数据泄露等安全威胁。

  • 快速启动和预热:GraalVM能够实现快速的应用程序启动,并且无需预热即可获得最佳性能。

  • 工具链:提供了一套工具,如调试器、性能分析器等,帮助开发者开发和优化应用。

了解完GraalVM的特性,很多小伙伴会说这东西看起来不错,但用于生产环境是刚需吗?实际情况下能解决我们的哪些痛点?我将在下文中为大家解答。

Java服务慢的问题能解决吗?

Java开发的小伙伴,是否吐槽过Java慢?这里总结下服务慢的槽点主要三个方面:

  • 微服务光启动就得花5-6分钟,虚拟内存占用越来越大,要不要再扩点资源?

  • JVM参数要不要调一下,怎么调?

  • 代码里有没有慢SQL,怎么优化?

上面的启动慢和JVM调参两个问题,开发小伙伴确实痛但又不得不面对,只能期望官方解决这个问题。针对代码中慢SQL问题,目前行业内有一些工具,但大多都是基于经验规则审核,不能有效识别性能问题,无法彻底根治。那有没有彻底根治慢问题的方式呢?

1)微服务启动慢和JVM调参问题如何彻底解决?

Orace官方新推出的GraalVM,大家的期望实现了,直指痛点解决上面两个问题,官方为什么要干掉JVM呢?

  • JVM作为Java程序的运行环境,光启动就得花一大把时间,在JVM启动完成后,才能执行应用程序本身的启动工作,这就是Java程序启动慢的根因。

  • JVM调参也是一门技术活,有门槛,依赖经验。

既然是JVM机制导致慢的问题,那官方就彻底干掉JVM,大家也许好奇,GraalVM是如何解决慢的问题的呢?

GraalVM核心功能是可以在本机直接运行高性能低占用的可执行二进制文件(换言之无需JDK环境即可运行)。与基于 JVM 的Java服务运行相比,经过编译得到的原生可执行文件的在启动速度方面有了很大优化,这一过程消除了对 JVM 或其他运行时环境的依赖,并降低了内存占用,从而使得Java程序能够快速启动。这对于云计算和微服务等需要快速启动和低内存使用的场景来说,是非常有益的。

2)SQL慢问题,如何从根源上识别代码SQL性能问题?

近期DBdoctor工具的SQL审核功能发布,开发同学的福音来了。DBdoctor是GraalVM的好搭档,在代码开发阶段就能评估出业务SQL未来上线后的真实性能,并给出优化建议,比如推荐最佳索引,解决业务SQL性能问题导致慢的问题。感兴趣的小伙伴可以看这一篇文章:

郑祥,公众号:DBdoctor数据库索引推荐大PK,DBdoctor和资深DBA的终极较量

服务慢的问题能彻底根治了,开发小伙伴可以行动起来了,GraalVM+DBdoctor可以让你的服务启动运行更加丝滑稳定。

三、如何使用GraalVM?

下面我们将通过一个简单的Java Demo来演示一下。

1)下载graalvm,并查看当前已安装的组件。

命令查看当前已安装的组件,可以看到native-image是默认安装的组件

cd graalvm-jdk-<version>_linux-<architecture>/bin./gu listComponentId              Version             Component name                Stability                     Origin---------------------------------------------------------------------------------------------------------------------------------graalvm                  23.0.4              GraalVM Core                  Supportednative-image             23.0.4              Native Image                  Early adopter

2)准备demo代码(maven工程)

这里使用了 native-maven-plugin maven插件,目的是简化编译的流程。当然也可以不使用插件,通过native-image命令直接进行编译。

a)工程目录结构

├── NativeImageDemo │   ├── pom.xml │   └── src │       ├── main │       │   ├── java │       │   │   └── HelloWorld.java │       │   └── resources

 b)HelloWorld.java

public class HelloWorld {    static class Greeter {        static {            System.out.println("Greeter is getting ready!");        }        public static void greet() {            System.out.println("Hello, World!");        }    }    public static void main(String[] args) {        Greeter.greet();    }}

c)pom.xml

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <groupId>org.example</groupId>    <artifactId>NativeImageDemo</artifactId>    <version>1.0-SNAPSHOT</version>    <properties>        <maven.compiler.source>17</maven.compiler.source>        <maven.compiler.target>17</maven.compiler.target>    </properties>    <build>        <plugins>            <plugin>                <groupId>org.graalvm.buildtools</groupId>                <artifactId>native-maven-plugin</artifactId>                <version>0.10.2</version>                <configuration>                    <imageName>${project.artifactId}</imageName>                    <mainClass>HelloWorld</mainClass>                    <skipNativeTests>true</skipNativeTests>                    <buildArgs>                        <buildArg>-H:+ReportExceptionStackTraces</buildArg>                    </buildArgs>                </configuration>            </plugin>        </plugins>    </build></project>

3)编译执行二进制程序

a)编译

cd 到项目根目录执行以下命令,等待片刻命令行输出 BUILD SUCCESS 说明编译成功。

mvn -U clean package native:compile========================================================================================================================GraalVM Native Image: Generating 'NativeImageDemo' (executable)...========================================================================================================================[1/8] Initializing...                                                                                    (4.8s @ 0.19GB) C compiler: gcc (redhat, x86_64, 4.8.5) Garbage collector: Serial GC (max heap size: 80% of RAM)[2/8] Performing analysis...  [****]                                                                     (3.9s @ 0.25GB)   1,856 (59.16%) of  3,137 types reachable   1,737 (46.34%) of  3,748 fields reachable   7,717 (35.62%) of 21,663 methods reachable     640 types,     0 fields, and   283 methods registered for reflection      49 types,    32 fields, and    48 methods registered for JNI access       4 native libraries: dl, pthread, rt, z[3/8] Building universe...                                                                               (1.0s @ 0.38GB)[4/8] Parsing methods...      [*]                                                                        (1.5s @ 0.33GB)[5/8] Inlining methods...     [***]                                                                      (0.4s @ 0.38GB)[6/8] Compiling methods...    [***]                                                                     (11.0s @ 0.51GB)[7/8] Layouting methods...    [*]                                                                        (1.0s @ 0.45GB)[8/8] Creating image...       [*]                                                                        (1.3s @ 0.52GB)   2.75MB (43.13%) for code area:     3,486 compilation units   3.46MB (54.34%) for image heap:   48,919 objects and 1 resources 165.42kB ( 2.53%) for other data   6.38MB in total------------------------------------------------------------------------------------------------------------------------Top 10 origins of code area:                                Top 10 object types in image heap:   1.43MB java.base                                          549.55kB byte[] for code metadata   1.13MB svm.jar (Native Image)                             415.45kB byte[] for java.lang.String  69.54kB com.oracle.svm.svm_enterprise                      325.83kB java.lang.String  33.89kB org.graalvm.nativeimage.base                       304.98kB java.lang.Class  30.23kB org.graalvm.sdk                                    253.66kB byte[] for general heap data  18.95kB jdk.internal.vm.ci                                 147.78kB java.util.HashMap$Node  14.10kB jdk.internal.vm.compiler                           111.71kB char[]   1.17kB jdk.proxy3                                          78.91kB java.lang.Object[]   1.15kB jdk.proxy1                                          72.50kB com.oracle.svm.core.hub.DynamicHubCompanion  360.00B jdk.proxy2                                          70.45kB byte[] for reflection metadata  162.00B for 1 more packages                                441.46kB for 506 more object types------------------------------------------------------------------------------------------------------------------------Recommendations: G1GC: Use the G1 GC ('--gc=G1') for improved latency and throughput. PGO:  Use Profile-Guided Optimizations ('--pgo') for improved throughput. HEAP: Set max heap for improved and more predictable memory usage. CPU:  Enable more CPU features with '-march=native' for improved performance. QBM:  Use the quick build mode ('-Ob') to speed up builds during development.------------------------------------------------------------------------------------------------------------------------                        0.8s (3.0% of total time) in 99 GCs | Peak RSS: 1.18GB | CPU load: 15.45------------------------------------------------------------------------------------------------------------------------Produced artifacts: /usr/local/NativeImageDemo/target/NativeImageDemo (executable)========================================================================================================================Finished generating 'NativeImageDemo' in 25.6s.[INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESS[INFO] ------------------------------------------------------------------------[INFO] Total time:  28.975 s[INFO] Finished at: 2024-07-21T13:29:33Z[INFO] --------------------------------------------------------------

b)执行二进制程序

cd到target目录,执行以下命令即可得到结果。可以看到NativeImageDemo文件是一个可执行文件,可以在任何相同架构的linux服务器上执行。

./NativeImageDemoGreeter is getting ready!Hello, World!

四、如何上线前发现性能问题?

DBdoctor下载完成后可以零依赖一分钟安装部署服务,SQL审核主要包括两个部分:

   a)SQL规则审核(规范):

SQL规则审核相当于公司的SQL规范,通过DBdoctor可以快速识别规范问题并指出问题原因。

图片

   b)SQL性能审核:

DBdoctor基于外置COST优化器,通过采集真实数据情况进行计算,最终得出所有索引组合的COST消耗排序,推荐COST最小的索引(最优索引)。只需要把SQL贴在SQL审核里进行审核,就能查看到推荐结果。

图片

五、总结

GraalVM Native Image技术为 Java应用带来快速启动和低资源消耗的优势,DBdoctor的SQL审核技术为Java应用带来快速SQL性能审核和无需生产变更就能评估的优势,GraalVM+DBdoctor的配合能助力Java服务提速,欢迎加入我们的技术交流群与我们探讨交流!

图片

图片

1️⃣ 产品介绍:

DBdoctor产品介绍

2️⃣免费下载/在线试用:

海信聚好看云服务—值得托付的人工智能互联网科技平台 - 海信聚好看云服务

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1956758.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AOP~面向切面编程介绍

AOP基础 概述 AOP&#xff1a;Aspect Oriented Programming&#xff08;面向切面编程、面向方面编程&#xff09;&#xff0c;面向特定方法的编程。 动态代理是面向切面编程最主流的实现。 SpringAOP是Spring框架的高级技术&#xff0c;旨在管理bean对象的过程中&#xff0c…

【基础篇】Docker 架构与组件 TWO

嗨&#xff0c;小伙伴们&#xff01;我是小竹笋&#xff0c;一名热爱创作的工程师。上一篇我们聊了聊 Docker 的历史与发展、与虚拟机的对比以及它在行业中的应用。今天&#xff0c;让我们更进一步&#xff0c;深入探讨 Docker 的架构与关键组件。 欢迎订阅公众号&#xff1a;…

Fantastic-admin:Vue 中后台管理系统

Fantastic-admin&#xff1a;Vue 中后台管理系统 在当今的前端开发世界里&#xff0c;fantastic-admin 作为一款功能强大的 Vue 中后台管理系统框架&#xff0c;简直是开发者的福音。本文将介绍 fantastic-admin 的基本信息、特点&#xff0c;以及如何快速上手和使用。 项目简介…

亚信安慧AntDB亮相PostgreSQL中国技术大会,获“数据库最佳应用奖”并分享数据库应用实践

7月12日&#xff0c;第13届PostgreSQL中国技术大会在杭州顺利举办&#xff0c;亚信安慧AntDB数据库荣获“数据库最佳应用奖”。大会上&#xff0c;亚信安慧AntDB数据库同事带来《基于AntDB的CRM系统全域数据库替换实践》和《亚信安慧AntDB数据库运维之路》两场精彩演讲&#xf…

AWS资源购买和使用:亚马逊云显示配额不足怎么解决

亚马逊云显示配额不足是许多AWS用户在使用云服务时可能遇到的常见问题。这种情况通常发生在用户试图启动新的EC2实例或扩展现有资源时&#xff0c;系统提示已达到特定资源类型的限制。本文中九河云将跟你们一起探讨这一问题的原因及其解决方案。 首先&#xff0c;了解AWS配额的…

最便宜的iPhone SE 4要来,配置爆炸但砍了灵魂

前几天乐视刚刚发布了「低配青春 AIR 版 iPhone SE 4」&#xff0c;电友们就坐不住了&#xff0c;纷纷问真 iPhone SE 4 究竟什么时候才能来。 阿红也去挖了一下情报&#xff0c;别说&#xff0c;还真在路上了。 众所周知&#xff0c;最近一代&#xff0c;也就是第三代 iPhone…

Liquibase 增加一列主键,自动生成 UUID:最佳实践与深度解析

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 自动生成 UUID UUID 是一种全局唯一的标识符&#xff0c;通常由 32 个十六进制数字组成&#xff0c;分为五组&#xff0c;形式如下&#xff1a; 123e4567-e89b-12d3-a456-426614174000在 Java 中&#xff0c;可以使…

从零开始写 Docker(十九)---增加 cgroup v2 支持

本文为从零开始写 Docker 系列第十九篇&#xff0c;添加对 cgroup v2 的支持。 完整代码见&#xff1a;https://github.com/lixd/mydocker 欢迎 Star 推荐阅读以下文章对 docker 基本实现有一个大致认识&#xff1a; 核心原理&#xff1a;深入理解 Docker 核心原理&#xff1a…

解锁未来安全:WT2003HP8芯片如何重塑智能电子锁的安全性与智能化体验

WT2003HP8混音芯片&#xff1a;智能电子锁的声音守护者 在当今这个追求智能化、便捷化的时代&#xff0c;智能电子锁作为智能家居的重要组成部分&#xff0c;正逐步改变着我们的生活方式。而WT2003HP8混音芯片&#xff0c;凭借其卓越的性能和广泛的应用潜力&#xff0c;在智能…

AFSim 仿真系统--任务处理器入门指南

任务处理器 任务处理器&#xff08;WSF_TASK_PROCESSOR&#xff09;是一个WSF处理器&#xff0c;它提供了检查轨迹管理器中的数据&#xff08;轨迹&#xff09;并对其采取行动的能力。这些行动包括&#xff1a; *向下属分配任务 *激活或停用传感器或干扰器 *开火武器 *操纵平台…

德国航空航天中心(DLR)利用元数据整理归纳Confluence

对于大型企业&#xff0c;在广阔的Confluence空间内找到信息&#xff0c;如同迷失在迷宫中。多年来&#xff0c;德国航空航天中心&#xff08;DLR&#xff09;依赖电子邮件和传统文件管理系统。在知识经理Andr Pliewischkies的领导下&#xff0c;公司引入了Confluence以减少信息…

Layui修改表格分页为英文

Layui修改表格分页为英文 1.前言2.Laypage属性 1.前言 主要记录初次使用Layui没有好好看官方文档踩坑&#xff0c;修改了源码才发现可以自定义 使用的Layui版本2.9.14 2.Laypage属性 Laypage属性中带的有自定义文本的属性 示例代码 table.render({.......page: {skipText: …

[米联客-安路飞龙DR1-FPSOC] SDK入门篇连载-09 PL AXI-GPIO实验

软件版本&#xff1a;Anlogic -TD5.9.1-DR1_ES1.1 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用安路(Anlogic)FPGA 实验平台&#xff1a;米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 ht…

buu做题(9)

[MRCTF2020]PYWebsite 有个二维码 扫了一下啊二维码 function enc(code){hash hex_md5(code);return hash;}function validate(){var code document.getElementById("vcode").value;if (code ! ""){if(hex_md5(code) "0cd4da0223c0b280829dc3ea4…

【C语言报错已解决】“Undefined Reference”

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言&#xff1a; 在开发过程中&#xff0c;我们经常会遇到各种编译错误或运行时错误。其中&#xff0c;“Undefined Referenc…

JavaFX布局-AnchorPane

JavaFX布局-AnchorPane 常用属性padding 实现方式Javafxml 将子节点锚定到容器的边界上&#xff0c;指定子节点相对于 AnchorPane 的四个边界&#xff08;上、下、左、右&#xff09;的距离适合宽高固定的一些表单如果允许最大化&#xff0c;拖动大小&#xff0c;需要自己计算子…

(面试必看!)一些和多线程相关的面试考点

文章导读 引言考点1. CAS 指令&#xff08;重点&#xff09;一、什么是CAS二、CAS 的优点三、CAS 的缺点四、ABA问题五、相关面试题 考点2. 信号量&#xff08;semaphore&#xff09;一、基本概念二、信号量的主要操作三、信号量的应用四、相关面试题 考点3、CountDownLatch 类…

万亿赛道 !二十届三中全会关于大规模设备更新措施深度解读 2024 !

第二十届三中全会审议通过《中共中央关于进一步全面深化改革、推进中国式现代化的决定》&#xff0c;涵盖300多项重要改革举措。总体而言&#xff0c;本次会议在财税体制改革、金融体制改革、统一大市场等方面做出了重点部署。此外&#xff0c;本次新增“高质量发展体制机制”作…

苹果手机丢了如何定位?3个技巧教你解决

在这个移动互联网高度发达的时代&#xff0c;苹果手机已成为我们日常生活中不可或缺的伴侣。然而&#xff0c;手机丢失的风险也随之增加。一旦手机不幸落入他人之手&#xff0c;不仅财产安全堪忧&#xff0c;个人隐私也可能面临泄露风险。那么&#xff0c;手机丢了如何定位呢&a…

【代码随想录训练营第42期 Day7打卡 LeetCode 454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和

目录 一、做题心得 二、题目及题解 454.四数相加II 题目链接 题解 383. 赎金信 题目链接 题解 15. 三数之和 题目链接 题解 18. 四数之和 题目链接 题解 三、小结 一、做题心得 今天是代码随想录训练营打卡的第七天&#xff0c;做的也是同昨天一样的哈希表部分…