在截至目前(2025-05-11)的java开发者看来,Spring/SpringBoot就是java web的代称。但稍微玩过云服务器的都知道——java/Spring/SpringBoot太吃内存了。稍微打包过SpringBoot工程的开发者都了解,根据Spring官方创建一个HelloWorld的web接口,加上mysql/redis这些中间件,打成的jar包就有30多M。运行内存占用150M是轻轻松松的。
我个人有一个历史工程,由最开始的SpringMVC+jsp修改成SpringBoot+JPA+Freemarker,再到最后的SpringBoot+JPA+Vue。目前运行内存占用800M,使用时会占用1G。
期间也关注过非Spring框架,如vertx、micronaut、quarkus、Javalin、helidon、solon等,也都试用了一下,说真的,各有各的问题,真应了那句:没有最好的,只有最合适的
。
稍微说几句:
- vertx应该是最省内存的,但是异步回调+eventbus通信,特别容易导致代码不好理解,因为现实中的很多代码都是顺序执行的。
- micronaut/quarkus都是为云原生而出现的。它们身上有SpringBoot的影子。
- 个人看来,Javalin/sparkJava用来做的小的单体工程还可以。
- Solon更像是从Spring那里抄的代码一样。
- helidon看来没有亮点,它有se/mp两个版本,更让人迷惑(需要多看官方文档)。
- golang是另一种编程语言,用它编写的web程序可以直接生成可执行文件。它的优点是启动速度快、内存占用少、打包体积小。但它的缺点是缺少规范,就像包的命令、繁琐的依赖注入、还有大量的
if err != nil
。
从个人体验上来说,需求固定且不易变动的任务可以使用golang,超级省内存。
需要持续维护的工程建议使用SpringBoot,SpringBoot真的太厉害了,帮开发人员做了太多太多的配置,真的是开箱即用。
最后多说一下quarkus。
我最近已经把quarkus框架引入到个人项目中,目前使用了rest、jpa/hibernate、mysql、redis,占用内存约200M,同样的功能使用SpringBoot+mybatisplus占用300M多。
quarkus有个dev页面,很好用,可以让开发人员了解系统中的配置及组件。
不过quarkus也有比较坑的地方,从官方的code.quarkus.io下载的代码都是只有一个pom.xml的工程,特别不利于模块化。因为quarkus没有main类,我第一次模块化工程的时候也很懵,连怎么启动工程都不知道。
特此说明,哪个模块作为启动入口就把如下配置放进去。
<plugin>
<groupId>${quarkus.platform.group-id}</groupId>
<artifactId>quarkus-maven-plugin</artifactId>
<version>${quarkus.platform.version}</version>
<extensions>true</extensions>
<configuration>
<debug>5005</debug>
</configuration>
<executions>
<execution>
<goals>
<goal>build</goal>
<goal>generate-code</goal>
<goal>generate-code-tests</goal>
<goal>native-image-agent</goal>
</goals>
</execution>
</executions>
</plugin>
启动工程的命令是mvn compile quarkus:dev -f path/to/your/pom.xml
(配置了上面plugin的pom.xml才行)。