前言

这两天封在家里,一直在琢磨想去把这个博客项目改成微服务的形式。不过就目前而言我的服务器内存放好几个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初体验的更多相关文章

  1. Spring之初体验

                                     Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...

  2. spring cloud 初体验

    spring cloud分为注册端.客户端以及消费端 初体验的理解就是: 注册端就是将之前所有的应用在这边进行注册,然后给每个应用都生成自己的标识,这些应用就是来自于客户端,消费端则通过调用注册端(有 ...

  3. spring boot --- 初级体验

    Spring boot的介绍我就不多说了,网上可以自己看一下. 它的优点就是:快!适合小白,没有复杂的配置文件. 缺点也很明显:坑有些多, 文档略少,报错有时不知道该如何处理. 下面做个最简单的入门: ...

  4. Spring(三) Spring IOC 初体验

    Web IOC 容器初体验 我们还是从大家最熟悉的 DispatcherServlet 开始,我们最先想到的还是 DispatcherServlet 的 init() 方法.我们发现在 Dispath ...

  5. Spring boot初入门

    1. Spring的Java配置方式 Java配置是Spring4.x推荐的配置方式,可以完全替代xml配置. 1.1. @Configuration 和 @Bean Spring的Java配置方式是 ...

  6. spring mvc(2) spring mvc初体验

    前面讲到随着前端技术的发展,web的开发已经实现了前后分离,并且spring mvc经过多个版本的更新,使用上也变得不一样,并且提供了很多便捷的功能.但是为了便于理解,我们使用比较原始的方式搭建spr ...

  7. spring native 初体验实现 小米控制美的空调

    目前关于 spring native 分享的文章还比较少 写这篇文章的主要目前是分享一下自己写的一个 小米控制美的空调 的程序 集成 spring native 过程中碰到的一些问题和解决方法 先放地 ...

  8. 第23章 Spring MVC初体验

    23.1 鸟瞰Spring MVC 粗略的介绍了SpringMVC的主要组成部分,SpringMVC作为一个Web层的框架,最大的作用是把我从繁重的web.xml文件编写中解救出来,再也不要不停的添加 ...

  9. Spring入门初体验

    Spring其实就是一个容器,让我们更方便的拿到想要的对象. 1.编写一个service // userService.java public interface userService { publ ...

  10. spring roo初体验

    1.下载spring-roo-2.0.0.M1,并执行如下命令,在/usr/local/bin下面建立一个roo的软连接   sudo ln -s /Users/pud/Documents/still ...

随机推荐

  1. 无需联网,一键永久激活所有Windows/Office

    对于 Windows 激活工具,大家可能了解不多,熟悉的比如小马激活工具,因为激活工具从来都是病毒高发区,各种工具混在一起,一不小心,电脑就中招了. 今天介绍一款不一样的. R@1n ReBirth ...

  2. Raize

    Raize.v5和Raize.v6 本人在windows10下装有delphi7和delphi2010,安装好Raize.v6后,两个版本delphi的控件页都找不到Raize控件,即使想编译相应的D ...

  3. AUTOCAD——半径标注命令

    创建圆或圆弧的半径标注. 执行方式 命令行:DIMRADLUS 菜单栏:标注→半径标注 工具栏:半径标注图标 "半径标注操作命令位置"界面 执行以上命令后,命令行会显示以下信息: ...

  4. C# null和Any()检查的快捷方式

    在C#6中 if (x.Items?.Any() == true) 也可以写自己的扩展方法: public static bool NotNullOrEmpty<T>(this IEnum ...

  5. charls抓包的乱码问题解决

    1. 在charls的安装目录下,去修改配置文件的值 ----Charles.ini,内容如下 2. SSL proxy setting 设置如下图 3. 顺便说一下,charls抓取 https的包 ...

  6. Java基础__05.网络编程

    通信协议 即约定网络通信时的一些内容. TCP和UDP对比 TCP:类比打电话 连接稳定 三次握手.四次挥手 客户端.服务端 传输完成.释放连接,效率低 UDP:类比发短信 不连接.不稳定: 客户端. ...

  7. Virtualbox EFI 写入startup.nsh

    安装好的Debian系统,重启后会因为找不到入口而无法启动.定位grubx64.efi文件,可用ls直接查找或一步一步查找ls fs0:\EFI\debian\grubx64.efi edit fs0 ...

  8. 【NPDP专项练习】第七章 产品生命周期管理

    第七章 产品生命周期管理 1.以下哪一项是产品生命周期缩短的原因之一? A 技术停滞不前 B 减少竞争 C 顾客要求更高 D 沟通障碍正在增加 答案:C 解析 A技术持续进步:B竞争加剧:D沟通增加 ...

  9. 动态规划-3-RNA的二级结构

    /*状态转移方程: OPT(i , j)= max(OPT(i , j − 1) , max( 1+OPT(i , t − 1)+OPT(t + 1, j − 1))), where the  max ...

  10. Azkaban 4.0.0 系列(一)-- Solo-Server

    下载 链接 https://github.com/azkaban/azkaban/releases/4.0.0.tar.gz 解压 tar -xzvf 4.0.0.tar.gz -C 自定义目标目录 ...