从GraalVM到Quarkus系列
A000篇-忽悠你用GraalVM
A001篇-NativeImage相关的注解
B001篇-NativeImage相关的注解@TargetClass
A002篇-GraalVM中的动态代理
从GraalVM到Quarkus系列-A000-忽悠你用GraalVM
准备好你的秀发
欢迎来到从入门到放弃系列第A000篇…
这玩意儿是啥?
Oracle 几年前出的一个虚拟机(类似JVM,但又不一样,甚至都不能算一个具体的虚拟机,它是一套组件),我记得两年前在掘金上还喷过,说Oracle出品的东西不敢用,现在看来,真香~~
- 科普定义的东西就不多说了,网上可以搜到,我们只关注它JVM-based以及Native Image相关的知识
- JVM-based就是Java,Scala,Groovy,Kotlin等基于JVM的语言
- Native Image可以理解为将字节码编译成原生程序一种技术(不带JVM那种,但是仍然可能附带一个小的运行时)
- 以上都是通俗的讲,并不是定义,只是便于理解,有些东西和实际是有一丢丢偏差的
为啥我们要用GraalVM?
- 优点
- 运行内存占用低,很低…
- 程序启动快,很快…
- 部署不需要运行时,也就是可以直接运行,不需要提前安装JVM,docker镜像也会小很多
- 以上说的是编译Native模式的(这不算一点)
- 啊? 这…上面几点还不够吗?(emmmmm…这也不算)
- 缺点
- 并不能直接复用现有的包, 需要进行适配(指的是Native模式), 其中最大原因是NativeImage编译期间会对各种class进行裁剪, 用不到的全部去掉(不是你的孩子我不要…), 但是!!! 这样会产生一个问题, 那就是有些包中动态加载或者动态生成的类, 仅仅是静态分析的话编译器是不能充分将他们纳入NativeImage中的(宛若智障…)
- 编译NativeImage时间很长…很长…而且期间你的CPU内存散热风扇将发挥他们毕生所学…不过可以选择使用docker编译,限制一下CPU内存使用就可以防止系统卡死,但是换来的是编译时间更长…
- 观点
用还是不用,大家需要自己去权衡,我这里只是列出我所了解的优缺点,如果你认为缺点可以接受,优点又足够馋人,那就冲吧骚年
咋用?
- 首先,安装GraalVM,下载对应操作系统的版本即可
- 我系统用的Deepin Linux,按照文档可以很快安装完成,macOS可以试下,Win写代码还是可以的,NativeImage编译不建议尝试,我只编译成功过HelloWorld…不过可以在Win10 的WSL(最好是WSL2,Win10 2004以及之后的版本可以安装)里面编译运行
- 基本上和配置JDK差不多,配置个JAVA_HOME,最多再用gu(GraalVM Updater)安装个NativeImage组件
- 编译成NativeImage, 我准备水了这段(因为懒,不不不,文章后面会详细讲的…), 或者看下官方文档也是极好的, 如果打不开的话,那一定是你人品不行(科.学.上.网)
- 只看Native Images这一节就行,示例是Hello Dad,暂时不要尝试编译别的,因为很可能编译不过…
- 注意:系统环境变量有Node的秃子们注意下,GraalVM自带一个Node(包括NPM),但是版本比较旧,做大前端或者Node后端开发可能会遇到坑
代码时间
- 用idea(社区版本即可)创建个maven项目archetype用
maven-archetype-quickstart
(maven仓库访问不了或者太慢了,配置个镜像即可) - 现在这个hello dad已经可以运行了(如果你想的话)
- 现在我们编译一下
. 命令行(pom.xml目录下)
. 或者IDEA(最好先clean一下)mvn clean package
- 现在target目录下应该有打包好的jar包了
- 在命令行使用native-image命令编译(这个程序是安装graalvm时带的;在target目录执行)
native-image -jar ./graalvm-aooo-1.0-SNAPSHOT.jar
嗯…可以看出进展很"顺利"… - 不要慌…在maven pom.xml插件加个配置,配置一下mainClass即可
- 重复上述3,4,5步骤,这是步骤5的正确输出:
- 这时候target目录下已经生成了一个可执行程序(这个hello world 7M多…由于我在Linux下操作,所以可执行程序可以没有扩展名):
- 直接执行(target目录)
./graalvm-aooo-1.0-SNAPSHOT
小结
- 本章节内容只是让秃子们了解GraalVM是什么,有什么东西,大体有个了解
- 嫌弃我唠叨的可以直接看粗体的文字,是不是说的有点晚…
- graalvm在类unix系统下可以用sdkman安装(科.学.上.网)