SpringBoot 3.2正式版,开箱即用的虚拟线程和GraalVM,尝鲜一下!

GraalVM入门以及环境搭建 GraalVM是开发人员编写和执行Java代码的工具。具体来说,GraalVM是由Oracle创建的Java虚拟机(JVM)和Java开发工具包(JDK)。它是一个高性能的运行时,可以提高应用程序的性能和效率。GraalVM的目标包括:编写一个更快、更易于维护的编译器,提高在JVM上运行的语言的性能,减少应用程序启动时间,将多语言支持集成到Java生态系统中,以及为此提供一组编程工具。GraalVM向JDK添加了一个优化编译器,它为各种语言提供性能优化,并为多语言应用程序提供互操作性。... 阅读详情

Spring Boot 3.2 近日刚刚发布,让我们用 Java 21、GraalVM 和虚拟线程来尝试一下。

Spring Boot 3.2 支持:

  • Java 21

  • 虚拟线程

  • 原生镜像(自 2022 年 11 月 Spring Boot 3.0 发布以来,Spring Boot 已在生产环境中支持 GraalVM 原生镜像)

Java 21

我们期待 2023 年 9 月 19 日发布的 Java 21,Spring Boot 3.2 已经做到完全支持了。

Java21部分新特性:https://mp.weixin.qq.com/s/f8HonH72YxIgWN8De6U0Jg

正如所声明的那样,Java 21 提供了数千项性能、稳定性和安全性改进,包括平台增强功能,可帮助开发人员提高生产力并推动整个组织的创新和增长。

虚拟线程

更重要的更新之一是虚拟线程,这是 Project Loom 提供的功能。我们不打算深入细节,官方 JEP 提供了很好的解释:

https://openjdk.org/jeps/444

GraalVM和本机镜像

GraalVM 是一种高性能 JDK,可以使用替代的即时 (JIT) 编译器来加快 Java 和基于 JVM 的应用程序的性能。

Native Image 是一种提前将 Java 代码编译为独立可执行文件(称为本机映像)的技术。该可执行文件包括应用程序类、其依赖项中的类、运行时库类以及来自 JDK 的静态链接本机代码。

它不在 Java VM 上运行,但包含来自不同运行时系统的必要组件,如内存管理、线程调度等。与 JVM 相比,生成的程序具有更快的启动时间和更低的运行时内存开销。

尝鲜一下

让我们从安装 Java 21.0.1 graal 开始,最简单的方法是使用SDKMAN 并将其指定为您机器的默认 Java 版本:

  • sdk install java 21.0.1-graal

  • sdk default java 21.0.1-graal

另一种安装方法是手动下载

https://www.graalvm.org/downloads/

我们将使用Spring Initializr页面创建一个新的Spring Boot项目,使用 Spring Boot 3.2.0、Java 21、Gradle-Groovy以及Spring Web和GraalVM本地支持依赖项。另外,推荐公众号Java精选,回复java面试,获取面试资料,支持随时随地刷题。

要在 Spring Boot 3.2 中启用虚拟线程,我们只需在 application.yml 或 application.properties 文件中设置一个属性:

spring.threads.virtual.enabled:true

这个配置起到的作用:

  • Tomcat 将使用虚拟线程来处理 HTTP 请求。这意味着处理 Web 请求的应用程序代码(例如控制器中的方法)将在虚拟线程上运行。

  • 调用@Async方法时,Spring MVC 的异步请求处理和 Spring WebFlux 的阻塞执行支持现在将利用虚拟线程

  • 标记有@Scheduled的方法将在虚拟线程上运行

因此,我们将尝试使用这 3 个集成来实现虚拟线程。

此外,一些特定的集成将在虚拟线程上工作,例如 RabbitMQ/Kafka 监听器,以及 Spring Data Redis/Apache pulsar 相关的集成。但这些集成超出了本文的范围,有兴趣的可以参考 Spring Boot 3.2 官方示例。

代码

1.对于Tomcat传入HTTP请求,我们创建一个简单的控制器:

@RestController
@RequestMapping("/test")
public class TestController {
    private static final Logger log = LoggerFactory.getLogger(TestController.class);

    @GetMapping
    public void test() {
        log.info("Rest controller method has been called {}", Thread.currentThread());
    }
}

2.异步任务

我们将在应用程序启动时调用其“run”方法

@Component
public class AsyncTaskExecutorService {
    private static final Logger log = LoggerFactory.getLogger(AsyncTaskExecutorService.class);

    @Async
    public void run() {
        log.info("Async task method has been called {}", Thread.currentThread());
    }
}

3.Scheduled定时任务

一个简单的方法,每 15 秒调用一次

@Component
public class SchedulerService {
    private static final Logger log = LoggerFactory.getLogger(SchedulerService.class);

    @Scheduled(fixedDelayString = "15000")
    public void run() {
        log.info("Scheduled method has been called {}", Thread.currentThread());
    }
}

让我们运行我们的应用程序:

./gradlew bootRun

并调用我们的端点

curl — 位置 — 请求 GET 'localhost:8085/test'

我们得到什么:

Starting AppApplication using Java 21.0.1 with PID 38126
Started AppApplication in 1.131 seconds (process running for 1.491)
Async task method has been called VirtualThread[#52,task-1]/runnable@ForkJoinPool-1-worker-5
Scheduled method has been called VirtualThread[#46,scheduling-1]/runnable@ForkJoinPool-1-worker-1
Rest controller method has been called VirtualThread[#62,tomcat-handler-0]/runnable@ForkJoinPool-1-worker-1
Scheduled method has been called VirtualThread[#46,scheduling-1]/runnable@ForkJoinPool-1-worker-1

我们可以看到我们的方法的日志链接到公共 ForkJoinPool 线程池。

根据JEP:预期行为:

JDK 的虚拟线程调度程序是一个工作窃取的 ForkJoinPool,它以 FIFO 模式运行。调度程序的并行度是可用于调度虚拟线程的平台线程的数量。

现在让我们在 GraalVM 上运行它。

首先,我们需要构建一个 GraalVM 本机映像:(此命令可能需要几分钟)然后运行:(使用您的应用程序的名称而不是“app”)

./gradlew nativeCompile

./build/native/nativeComplie/app

它也可以工作,并且启动时间要快得多,这符合声明的“与 JVM 相比,生成的程序具有更快的启动时间和更低的运行时内存开销”。

在这里您可以找到包含本文中使用的代码的存储库来源:

https://github.com/egor-ponomarev/spring-boot3.2-with-graalvm-virtual-threads-example

代码

Spring Boot 3.2 是我们一直在等待的东西!具有虚拟线程的本机映像允许我们编写能够提供与 Go 类似级别的性能和可扩展性的代码,从而保持 JVM 的强大生态系统。

但是,您必须考虑到并非所有库都已采用其代码来与虚拟线程正常工作(在大多数情况下,它正在用 ReentrantLock 替换“synchronize”块),您应该小心虚拟线程将使用的逻辑。

来源|https://medium.com/@egorponomarev

GraalVM简介及使用 在本文中,我们将回顾 GraalVM 是什么、它是如何工作的,以及即时 (JIT) 编译和提前 (AOT) 编译之间的区别? GraalVM 是一种高性能运行时,为用 Java 和其他语言编写的应用程序提供了显着的优势。它由 Oracle 开发,通过利用高级优化和独特的架构,可以更快、更高效地运行应用程序。 阅读详情

相关推荐

JVM-GraalVM云原生时代的Java虚拟机

大部分脚本语言或者有动态特效的语言都需要一个语言虚拟机运行,比如CPython,Lua,Erlang,Java,Ruby,R,JS,PHP,Perl,APL等等,但是这些语言的虚拟机水平很烂,比如CPython的VM就不忍直视,而HotSpotVM是虚拟机的大神级别,如果能用上HotSpot,能用上顶级的即时编译器(JIT)、性能优化、垃圾回收等技术,岂不爽歪歪!实际上,在充分预热的情况下,Java 程序中的热点代码早已经通过即时编译转换为二进制码,在执行速度上并不亚于静态编译的 C++ 程序。

weixin_43874650的博客 468

GraalVM-云原生时代的JVM(Java)

阿里云使用GraalVM来加速它们的Java应用程序,并且利用GraalVM的云支持,在云环境中运行它们的应用程序。GraalVM的即时编译器采用了新型的JIT技术,能够在运行时对代码进行优化,从而提高应用程序的性能。总之,GraalVM是一个非常强大和灵活的工具,可以帮助开发者构建高性能、多语言和云原生的应用程序。这种机制可以防止恶意代码的传播,从而保证系统的安全性。GraalVM的云支持使得它可以在云环境中运行,这意味着开发者可以将应用程序轻松迁移到云上,并且能够利用云环境的弹性扩展和负载均衡等特性。

MayMatrix 的博客 7487

Springboot3新特性:GraalVM Native Image Support和虚拟线程(从入门到精通)

Springboot3新特性:GraalVM Native Image Support和虚拟线程(从入门到精通)

nanshaws的博客 2509

JVM工作原理与实战(三十六):GraalVM虚拟机

JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了GraalVM、GraalVM的两种运行模式、GraalVM应用场景、参数优化和故障诊断等内容。

Rye的博客 6095

MATLAB实战:蓝牙GFSK调制解调全流程解析(附误码率优化技巧)

本文深入解析了蓝牙GFSK调制解调在MATLAB中的全流程实现,包括高斯滤波器设计、调制解调技术及误码率优化技巧。通过实战案例和代码示例,帮助工程师提升蓝牙通信系统的性能表现,特别是在降低误码率方面的有效方法。

weixin_29046035的博客 277

AP发票批量付款程序(WEB ADI)

CREATE OR REPLACE PACKAGE MEW_AP_BATCH_PAYMENTS_PKG IS   PROCEDURE MAIN(P_BATCH_ID          NUMBER                 ,P_ORG_ID            NUMBER                 ,P_BANK_ACCOUNT_NAME VARCHAR2

储藏室 5052

Spring Boot 3.2 正式发布,开箱即用的虚拟线程和 GraalVM,尝鲜一下!

???? 这是一个或许对你有用的社群???? 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料:《项目实战(视频)》:从书中学,往事上“练”《互联网高频面试题》:面朝简历学习,春暖花开《架构 x 系统设计》:摧枯拉朽,掌控面试高频场景题《精进 Java 学习指南》:系统学习,互联网主流技术栈《必读 Java 源码专栏》:知其然,知其所以然????这是一个或许...

芋艿V 423

你不知道的Postman的Mock接口测试,看这一篇就够了

创建Mock服务你可以从Postman已有的测试集(Collection)中创建Mock Server或者直接创建Mock Server(我们这里选择从已有的测试集中创建Mock Server)Mock server详细配置页面,在此页面中我们可以设置:命名Mock Server选择一个环境(可选的),我们可以选择之前设置过的环境,Mock Server将会使用对应环境中设置过的变量在对应的请求和响应中如果想要将Mock Server设置私有访问的,那么可以勾选此选项,不勾选则对所有人可见。

654

Spring Boot 3.2 尝鲜,开箱即用的虚拟线程和 GraalVM

往期热门文章: 1、MyBatis的10种精妙用法,真是妙啊! 2、公司新来一个同事,试图在业务代码中炫技,被开了... 3、大文件:如何实现秒传、断点续传、分片上传? 4、彻底告别 Controller、Service、Dao,让人上瘾的开发神器... 5、40 个 SpringBoot 常用注解:让生产力爆表!Spring Boot 3.2 已经发布,让我们用 Java 21、GraalVM...

Java后端技术 282

GEE:本地影像上传到GEE的Assets中,并输入机器学习算法中作为特征变量

当我们在 Google Earth Engine(GEE)中应用机器学习算法时,会输入一些影像作为特征变量数据,进一步根据这些特征影像去推理未知区域的数据。但是 GEE 平台上计算特征变量的 API 函数并不是非常全面,我们希望获得更多的特征用于分类。这个时候,我们可以将本地计算的特征影像上传到 GEE 中进行后续处理。本文记录了从本地上传特征数据到 GEE 的 Assets 中的教程,用于后续在 GEE 中分类或者回归使用。本文也可作为《》一文的补充。

养乐多的博客 1730

DISK配置服务器软RAID工作任务(RAID1+BITLOCKER)-winserver4

DISK配置服务器软RAID工作任务(RAID1+BITLOCKER)-winserver4

新时代先锋的博客 7299

Spring Boot 3.2 开箱即用的虚拟线程和GraalVM

来源:https://medium.com/@egorponomarev/spring-boot-3-2-with-virtual-threads-and-graalvm-out-of-the-box-1911d3ebf0b6Spring Boot 3.2 已经正式发布,让我们用 Java 21、GraalVM 和虚拟线程来尝试一下。Spring Boot 3.2 支持:Java 21虚拟线程原生...

程序猿DD 546

鸿蒙应用发布实战:应用热更新的实现

在移动应用开发领域,应用更新是持续交付价值的关键环节。传统的应用更新方式需要用户手动下载完整安装包,不仅用户体验差,而且更新率往往不理想。热更新技术(也称为OTA更新)允许应用在不重新安装的情况下动态更新部分功能,极大提升了用户体验和迭代效率。本文专注于鸿蒙操作系统下的应用热更新实现方案,涵盖从原理到实践的完整知识体系。鸿蒙热更新的技术架构差分更新算法实现动态部署机制实际项目中的最佳实践安全与性能优化策略首先介绍鸿蒙热更新的背景和核心概念深入分析技术原理和算法实现。

操作系统内核探秘的博客 965

SpringBoot3.2 + jdk21 + GraalVM上手体验

这次咱们来聊聊我最近折腾的一套组合拳:Spring Boot 3.2 + JDK 21 + GraalVM。一句话总结——真香!!!🐂为什么这么说?我先把我的测试环境放这:我用的是MacBook Pro M1,16G内存,最新版本的IntelliJ IDEA,JDK升到了21,Spring Boot上了3.2,然后重点来了,我用了GraalVM搞原生镜像编译,整个体验下来,确实有点爆。下面我来详细说说整个过程和我的一些真实体验,踩坑点也不会藏着掖着。1)JDK 21 + Spring Boot 3.2:语

m0_73735578的博客 1431

搬运机器人系列编程:KUKA KR QUANTEC_(2).KUKA KRL语言编程基础

定义一个函数END!调用函数PRINT "结果: ", result!定义一个过程PRINT msgEND!调用过程printMessage("欢迎使用 KUKA 机器人")!定义搬运零件的起始位置和目标位置!定义焊接路径的各个点!定义喷涂路径的各个点KUKA Robot Language (KRL) 是一种专门为工业机器人设计的编程语言,具有结构化编程、丰富的库函数、实时性以及集成性等特点。

zhubeibei168的博客 1248

SAP S/4 FICO科目辅助余额表开发说明书(包括测试样例、程序代码仅作参考,不保证一定可以运行)

SAP S/4 FICO科目辅助余额表开发说明书(包括测试样例、程序代码仅作参考,不保证一定可以运行)

我好像病了的博客 329

SpringBoot3 使用虚拟线程

用最简单的方式使用虚拟线程

yaobo2816的专栏 1847

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Spring Boot 3.2 正式发布,一波新特性,开箱即用!

点击关注公众号:互联网架构师,后台回复2T获取2TB学习资源!上一篇:2T架构师学习资料干货分享大家好,我是互联网架构师!Spring Boot 3.2 昨日发布,让我们用 Java 21、GraalVM 和虚拟线程来尝试一下。Spring Boot 3.2 支持:Java 21虚拟线程原生镜像(自 2022 年 11 月 Spring Boot 3.0 发布以来,Spring Boot 已在生...

emprere的博客 825

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Spring Boot 3.2 新特性!10 个指令实现虚拟线程与 GraalVM 优化

文中介绍的 10 个指令,涵盖了虚拟线程的开启、配置、使用,以及 GraalVM 优化的依赖添加、参数配置、编译运行等关键环节,为开发者提供了清晰的实现路径。而虚拟线程是由 JVM 管理的轻量级线程,不直接映射到操作系统线程,其创建和切换成本极低,能够支持百万级别的并发量,大大提升了应用的并发处理能力。Spring Boot 3.2 对 GraalVM 进行了深度优化,提供了更完善的支持,让开发者能更便捷地将 Spring Boot 应用编译为原生可执行文件,充分发挥 GraalVM 的优势。

2503_92849134的博客 403

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

SpringBoot 3 新特性

Spring Boot 3 新特性

Fisher3652的博客 3639

Spring Boot 3.2 和 Spring Framework 6.1 添加了 Java 21、虚拟线程和 CRaC

关键要点Spring Framework 6.1(2023 年 11 月 16 日发布)和 Spring Boot 3.2(2023 年 11 月 23 日发布)在 Java 21 上运行。这些版本将使虚拟线程的并发编程更简单、更高效,并改进反应式编程和 Kotlin 协程。为了减少“缩减到零”的启动时间,最初支持 OpenJDK 项目 Checkpoint 的协调还原 (CRaC),而现有的 GraalVM 本机映像支持通过新的 GraalVM 版本获得了相当大的性能提升。

Eddiehy的博客 1990

Spring Boot 3.0新特性解析:虚拟线程与GraalVM原生镜像实践

Spring Boot 3.0的发布为Java开发领域带来了一系列令人瞩目的新特性,其中虚拟线程和GraalVM原生镜像尤为突出。虚拟线程为Java应用带来了轻量级并发处理能力,而GraalVM原生镜像则显著提升了应用的启动速度和资源利用率。本文将深入解析这两个特性,并通过实践案例展示如何在Spring Boot 3.0中应用它们。

梵心白莲的博客 604

Spring Boot 3.5正式普及!Java虚拟线程+GraalVM原生镜像,启动仅0.3秒

开头先聊个扎心的场景早上九点,你端着咖啡坐到工位,着急发版。点开IDE,按下Run,然后去倒杯水、刷俩短视频、跟同事扯几句淡——回来一看,Spring Boot还在"Banner"那儿转呢,Tomcat还没初始化完。你盯着那个光标,感觉时间被按下了0.5倍速。这还不算完。到了云原生时代,K8s Pod说挂就挂,弹性扩容时需要秒级启动,结果你的Java应用愣是花了5秒钟才准备好。云厂商按秒计费,用户按秒流失,老板按秒皱眉。

人工智能AI技术 447
上一篇: 一个 List.of 引发的“血案”
下一篇: “小度智能屏”被爆后台 “偷带宽”,一个月上传数据高达 6T
IT界那些事儿
博客等级 码龄6年 2万+粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值