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 ...
随机推荐
- Java基础学习:12、代码块
1.定义: 代码块又称为初始化块,属于类中的成员,将逻辑语句封装在方法体中,通过{}包围起来. 2.分类: 普通代码块.静态代码块(有static修饰) public class Block { pu ...
- flutter SliverPersistentHeader子组件透明度渐变【滑动悬停appbar添加自定义组件的透明度】
在开发flutter悬停头部中,发现一个问题. 我们通常使用SliverAppBar(),去实现悬停的功能,在使用appbar的时候满足不了我们的需求,就需要自定义, 如下:在title中写了一个搜索 ...
- vscore 中 vim 常用快捷键
谷歌浏览器 ctrl + T 新建一个页面 ctrl + J 查看下载界面 F6 直接搜索 vscore 在 vscore 中使用 vim 建议去掉 ctrl 键的功能捆绑,不然会覆盖掉很多的 vsc ...
- Java基础__04.GUI编程
GUI编程常见的组件: 窗口 弹窗 面板 文本框 列表框 按钮 图片 监听事件 鼠标操作 键盘事件 GUI简介 GUI的核心技术:Swing AWT,是需要jre环境的. AWT介绍 包含了很多类和接 ...
- check power supply check cpu top
lshw -c power power supply mwh https://www.eia.gov/energyexplained/electricity/electricity-in-the-us ...
- 输入流导致javax.crypto.BadPaddingException
使用FileInputStream一切正常,切换为使用classpath从jar包读取getResourceAsStream一直报如下错误 javax.crypto.BadPaddingExcepti ...
- 邮件合并 :处理ACCESS中批量查询语句的运行
利用邮件合并,制作批量查询语句,一条一条的复制粘贴并运行. 有点笨但是想不出什么好办法,除非用模块的过程,但还是要手动输入参数.http://www.docin.com/p-695725657.htm ...
- 【Ubuntu】Ubuntu 技巧集锦
『Ubuntu 22.04 国内镜像 阿里云/163源/清华大学/中科大』 『各种 Proxy 设置 GUI/Terminal/APT』 『设置 wget Proxy』 『设置右键菜单-新建文档』 『 ...
- agl---atumotive grade linux开篇
linux本人也玩过,捯饬过双系统win7+Ubuntu,搞过虚拟机跑fedora,做开发,除了觉得酷,能接触到整个程序开发.编译.链接,程序效率高外,没觉得啥好,关键生态也无丰富,我这种伪码农,也就 ...
- git将自己分支上忽略已修改但不需要的提交的文件
一:在idea上把需要提交的文件勾选上提交 二:git stash命令将余下被修改的文件存入(隐藏)暂存区 git stash 三:切换master分支合并上述分支 四:合并后再返回上述分支,git ...