GraalVM & Spring Boot初体验
前言
这两天封在家里,一直在琢磨想去把这个博客项目改成微服务的形式。不过就目前而言我的服务器内存放好几个Java进程是吃不消的,原因在于一个独立的JVM所占用的内存资源太吃内存。不过在云原生时代,使用容器化部署,每个服务单独享受一整块逻辑的内存空间,实际上对Java是非常不利的。而且即便有的应用功能非常简单,但是占用的内存和功能完全不在一个量级,这可能也是Java常常为人诟病的一点。不过现在有了GraalVM,似乎一切都变得不一样了。
配置
我下载的版本是GraalVM Community Edition 22.3.0,目前的最新版。大多数人其实更关心Spring项目如何整合这个JVM。根据官网配置,首先应该按照https://www.graalvm.org/22.3/docs/getting-started/macos/进行一些配置,接着在https://www.graalvm.org/22.3/reference-manual/native-image/下载GraalVM的一个组件Native Image:
gu install native-image
下载安装完以后,其实配置就可以了。现在需要到Spring官网https://start.spring.io/去生成一个Demo,注意把GraalVM Native Support DEVELOPER TOOLS这个依赖给选上,最终我的依赖文件长这个样子:
plugins {
id 'org.springframework.boot' version '2.7.5'
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
id 'java'
id 'org.springframework.experimental.aot' version '0.12.1'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'
repositories {
maven { url 'https://repo.spring.io/release' }
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-aop'
implementation 'org.projectlombok:lombok:1.18.22'
annotationProcessor 'org.projectlombok:lombok:1.18.22'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}
tasks.named('bootBuildImage') {
builder = 'paketobuildpacks/builder:tiny'
environment = ['BP_NATIVE_IMAGE': 'true']
}
也不需要你去做什么,基本都自动生成了。我这里用的Spring Boot版本是2.7.5。
当GraalVM把项目构建完以后,在IDEA的Gradle插件的build下面选择nativeCompile

然后开启漫长的编译过程:

编译成功然后在build文件夹下就会有这么一个二进制可执行文件demo:

这个文件可以直接双击启动:

启动用时52毫秒,非常的可以了。
而内存占用呢:

不可能不心动。Java直接变成go了。
补充
如果需要在项目里使用动态代理,需要显示指定需要代理的类,如:
@SpringBootApplication
@AotProxyHint(targetClass=com.example.demo.controller.TestController.class, proxyFeatures = ProxyBits.IS_STATIC)
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
本质是对这个切面的配置:
@Aspect
@Component
@Slf4j
public class TestAspect {
@Pointcut("execution(* com.example.demo.controller..*.*(..))")
public void pt() {}
@SneakyThrows
@Before("pt()")
public void before(JoinPoint jp) {
log.info("java");
}
}
不显示声明的话启动会报错。原因在于JVM的设计是一个开放的系统,有些类是在运行时加载到虚拟机里的,这个就涉及了Java动态代理的原理。如果把程序编译成二进制的文件脱离了JVM,就丧失了这种开放性,所以只能用这种没有办法的办法将所有需要被代理的类枚举式的声明出来,在构建二进制文件的时候就把这些类提前的构建出来。
GraalVM & Spring Boot初体验的更多相关文章
- Spring之初体验
Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...
- spring cloud 初体验
spring cloud分为注册端.客户端以及消费端 初体验的理解就是: 注册端就是将之前所有的应用在这边进行注册,然后给每个应用都生成自己的标识,这些应用就是来自于客户端,消费端则通过调用注册端(有 ...
- spring boot --- 初级体验
Spring boot的介绍我就不多说了,网上可以自己看一下. 它的优点就是:快!适合小白,没有复杂的配置文件. 缺点也很明显:坑有些多, 文档略少,报错有时不知道该如何处理. 下面做个最简单的入门: ...
- Spring(三) Spring IOC 初体验
Web IOC 容器初体验 我们还是从大家最熟悉的 DispatcherServlet 开始,我们最先想到的还是 DispatcherServlet 的 init() 方法.我们发现在 Dispath ...
- Spring boot初入门
1. Spring的Java配置方式 Java配置是Spring4.x推荐的配置方式,可以完全替代xml配置. 1.1. @Configuration 和 @Bean Spring的Java配置方式是 ...
- spring mvc(2) spring mvc初体验
前面讲到随着前端技术的发展,web的开发已经实现了前后分离,并且spring mvc经过多个版本的更新,使用上也变得不一样,并且提供了很多便捷的功能.但是为了便于理解,我们使用比较原始的方式搭建spr ...
- spring native 初体验实现 小米控制美的空调
目前关于 spring native 分享的文章还比较少 写这篇文章的主要目前是分享一下自己写的一个 小米控制美的空调 的程序 集成 spring native 过程中碰到的一些问题和解决方法 先放地 ...
- 第23章 Spring MVC初体验
23.1 鸟瞰Spring MVC 粗略的介绍了SpringMVC的主要组成部分,SpringMVC作为一个Web层的框架,最大的作用是把我从繁重的web.xml文件编写中解救出来,再也不要不停的添加 ...
- Spring入门初体验
Spring其实就是一个容器,让我们更方便的拿到想要的对象. 1.编写一个service // userService.java public interface userService { publ ...
- spring roo初体验
1.下载spring-roo-2.0.0.M1,并执行如下命令,在/usr/local/bin下面建立一个roo的软连接 sudo ln -s /Users/pud/Documents/still ...
随机推荐
- Neural Network模型复杂度之Residual Block - Python实现
背景介绍 Neural Network之模型复杂度主要取决于优化参数个数与参数变化范围. 优化参数个数可手动调节, 参数变化范围可通过正则化技术加以限制. 本文从优化参数个数出发, 以Residual ...
- SignalR v3.1.3.js [支持微信小程序]
微信小程序开发中想做实时通知功能.作为一个.net系的程序员,当然首选SignalR,但是默认的js客户端库不支持微信小程序,因为微信小程序的websocket是使用自己的一套相关api来创建和管理的 ...
- build opencv with qt to make debugging easier
最近发现使用自己编译的opencv,可以增强opencv的imshow函数功能.从哪里得到的线索已经忘记了.可能是无意中发现的某一张截图吧. 要实现cv::imshow函数功能增强,需要在cmake中 ...
- Jmeter 命令执行脚本并输出报告
Jmeter 可以通过cmd 命令执行脚本,并输出报告 执行顺序如下: 第一 进入 安装的jmeter bin 目录下:(我安装的是E盘)
- centos上安装python3.6环境和 pip3
本篇使用的方法,在不删除Python2的版本,使得Python3和Python2共存 1.yum 安装依赖命令: yum -y install zlib-devel bzip2-devel opens ...
- supertv
Banben:1.3BanbenendGengxinnr:死宅1.2更新内容:[换行]- 增加视频分享[换行]- 支持浏览器打开观看视频GengxinnrendDownurl:http://bmob- ...
- Apollo配置中心拉取,通过单独打包解决 Get config services failed from http://阿里云局域网访问IP:8080/services/config?appId=MyAppId&ip=192.168.145.1 Cause Could not complete get operation
Apollo配置中心拉取,通过单独打包解决 Get config services failed from http://阿里云局域网访问IP:8080/services/config?appId=M ...
- R语言主成分PCA、因子分析、聚类对地区经济研究分析重庆市经济指标|附代码数据
全文下载链接:http://tecdat.cn/?p=27515 最*我们被客户要求撰写关于主成分PCA.因子分析.聚类的研究报告,包括一些图形和统计输出. 建立重庆市经济指标发展体系,以重庆市一小时 ...
- kali 更新到最新版(测试中...)
# 确认源 (下面用阿里云的源举例) echo "deb https://mirrors.aliyun.com/kali kali-rolling main non-free contrib ...
- VS Code:4个中文乱码问题及解决方法-转载
https://www.jianshu.com/p/6a2c21cc07bb 1. 背景 凡是编程软件,特别是国外的软件,都有或多或少的中文乱码问题(毕竟程序都是用英文写的).现提出VS Co ...