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

前言

对于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.mzph.cn/pingmian/51625.shtml

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

相关文章

【初阶数据结构题目】3.删除有序数组中的重复项

文章目录 顺序表算法题代码&#xff1a; 顺序表算法题 点击链接做题 删除有序数组中的重复项 思路&#xff1a;定义两个指针变量。dst指向数组第一个位置&#xff0c;src指向数组第二个位置。判断nums[dst]是否等于nums[src] 相等&#xff0c;src不相等&#xff0c;dst,nums[…

Windows 11 桌面模拟

Windows 11 桌面模拟 文章目录 Windows 11 桌面模拟代码结构HTML结构CSS样式JavaScript功能 源码效果图 代码结构 HTML结构 <html>: HTML文档的根元素。<head>: 包含文档的元数据&#xff0c;如标题和样式。<base>: 指定相对URL的基准。<title>: 指定…

力扣刷题160 相交链表

题目 力扣题目地址&#xff0c;点此可直接跳转 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 来源&#xff1a;力扣&…

60、redis安装和部署

一、关系型数据库与非关系型数据库 1.1、关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上一般面向于记录。SQL语句&#xff08;标准数据查询语言&#xff09;就是一种基于关系型数据库的语言&#xff0…

pycharm 新建Python项目 使用anaconda环境

1.pycharm 新建完Python项目 2.文件-设置-具体项目-Python解释器-添加解释器-Conda执行文件选择你自己anaconda安装目录下Scripts\conda.exe -加载环境-选择现有的Conda环境或者新建一个环境

将gitee 上的nvim 配置 从gitee 上下载下来,并配置虚拟机

首先是下载 gitee 上的配置。 然后是 配置 tmux 然后是配置nvim . 1 在init.lua 文件中注释掉所有的与第三方插件有关的内容。 2 在packer 的文件中 &#xff0c; 注释掉所有的与 第三方插件有关的代码。 3 首先要保证 packer 能够正确的安装。 4 然后开始 安装 所有的插件…

自动化立体库各种故障解除方案

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 完整版文件和更多学习资料&#xff0c;请球友到知识星球【智能仓储物流技术研习社】自行下载 堆垛机故障解除方案核心内容&#xff1a; 故障代码与可能原因&#xff1a; F01&#xff…

SpringDataJPA(三):多表操作,复杂查询

一、Specifications动态查询 有时我们在查询某个实体的时候&#xff0c;给定的条件是不固定的&#xff0c;这时就需要动态构建相应的查询语句&#xff0c;在Spring Data JPA中可以通过JpaSpecificationExecutor接口查询。相比JPQL,其优势是类型安全,更加的面向对象。 import …

五大AI测试开源框架及使用方法介绍

AI测试框架是一套系统的测试工具和方法&#xff0c;包括测试的规范和基础代码&#xff0c;涵盖了一系列的测试思想和方法。这些框架可以帮助开发者和测试人员对AI模型进行测试&#xff0c;确保AI模型在真实世界的应用中能够达到预期的效果。接下来的内容&#xff0c;我们将介绍…

可视化目标检测算法推理部署(一)Gradio的UI设计

引言 在先前RT-DETR模型的学习过程中&#xff0c;博主自己使用Flask框架搭建了一个用于模型推理的小案例&#xff1a; FlaskRT-DETR模型推理 在这个过程中&#xff0c;博主需要学习Flask、HTML等相关内容&#xff0c;并且博主做出的页面还很丑&#xff0c;那么&#xff0c;是…

大模型微调:参数高效微调(PEFT)方法总结

PEFT (Parameter-Efficient Fine-Tuning) 参数高效微调是一种针对大模型微调的技术&#xff0c;旨在减少微调过程中需要调整的参数量&#xff0c;同时保持或提高模型的性能。 以LORA、Adapter Tuning 和 Prompt Tuning 为主的PEFT方法总结如下 LORA 论文题目&#xff1a;LORA:…

[Linux安全运维] MySQL 数据库安全配置

MySQL 安全配置 1 .1 MySQL备份 1 .1 .1 命令 1.数据库备份 mysqldump -uroot -p123456 bbs > /tmp/bbs.sql2.删除数据库 drop database bbs;3.创建数据库 create database bbs character set utf8;4.导入备份 mysql -uroot -p123456 bbs < /tmp/bbs.sql5.sql 语句…

java计算器,输入公式和对应变量的值

目标&#xff1a;最近想写个东西&#xff0c;本质就是一个计算器&#xff0c;我们可以输入公式&#xff08;例如&#xff1a;ab&#xff09;&#xff0c;然后把公式的值&#xff08;a:10,b:20&#xff09;也输入进去。最后得到结果。核心&#xff1a;这个想法核心部分就是给一个…

OpenCV C++的网络实时视频流传输——基于Yolov5 face与TCP实现实时推流的深度学习图像处理客户端与服务器端

前言 在Windows下使用TCP协议&#xff0c;基于OpenCV C与Yolov5实现了一个完整的实时推流的深度学习图像处理客户端与服务器端&#xff0c;为了达到实时传输的效果&#xff0c;客户端使用了多线程的方式实现。深度学习模型是基于onnxruntime的GPU推理。&#xff0c;实现效果如…

Web基础、apache和nginx的知识及服务搭建

一、Web基础概念和常识 Web&#xff1a;为用户提供的⼀种在互联网上浏览信息的服务&#xff0c;Web 服务是动态的、可交互的、跨平台的和图形化的。 Web 服务为⽤户提供各种互联网服务&#xff0c;这些服务包括信息浏览服务&#xff0c;以及各种交互式服务&#xff0c;包括聊…

Windows 11 实现移动热点自启动

原文链接&#xff1a;https://blog.iyatt.com/?p16784 背景 公司的 WiFi 用起来很卡&#xff0c;但是电脑有线使用网络又是正常的&#xff0c;另外我用的那台台式机是有无线网卡的&#xff0c;平时就是用电脑开热点给手机用&#xff0c;但是每次开机都要自己手动启动就麻烦&…

【云原生】Kubernetes中crictl的详细用法教程与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

心动小站Ⅸ--Nvidia一种夸张的增长

当有灭绝级别的威胁时&#xff0c;你希望它如何出现在头版&#xff1f;华尔街日报或 CNN 的新闻中说它即将发生&#xff1f; 大多数新闻都是在灾难发生后才传到你耳中的。谈到人工智能&#xff0c;我们已经收到了很多警告&#xff0c;这些警告来自各个领域的专家&#xff0c;比…

下面关于枚举的描述正确的一项是?

A. 枚举中定义的每一个枚举项其类型都是String&#xff1b; B. 在Java中可以直接继承java.util.Enum类实现枚举类的定义&#xff1b; C. 利用枚举类中的values()方法可以取得全部的枚举项&#xff1b; D. 枚举中定义的构造方法只能够使用private权限声明&#xff1b; 答案选择…