Post

java vs go 启动的最小内存

最近学rust, 今天突发奇想一个问题:rust,go都是打包成本地应用,那么它和java项目内存使用哪个少一点呢?

内存使用少就意味着相同内存可以跑更多的服务。

凭直觉想想,java启动依赖jdk, 包括classloader那一套无论如何都需要加载到内存中的,肯定是java比rust要多。

然后就上手操练呗: 我准备了一个简单的项目,java是使用springboot写的只有一个controller并返回helloword的demo, go和rust也是如此,来看看内存使用情况。

首先申明这不是一个严格的测试,因为我也不太清楚怎么去看一个进程内存的使用情况(所以只是简单的在任务管理器中去看了下内存使用情况)。

java这块我先使用jconsole来进行监控,使用启动参数-Xms8M -Xmx16M 来进行调整。好确定最少堆使用多少能启动起来。

参数列表:

  • -Xms128M -Xmx128M ,可以成功启动项目,启动后查看内存大约用了32mb, 老年代无gc,新生代24次gc
  • -Xms32M -Xmx32M ,可以成功启动项目,启动后查看内存大约用了32mb,, 老年代无gc,新生代30次gc
  • -Xms8M -Xmx16M ,可以成功启动项目,启动后查看内存大约用了14.4mb,, 老年代119次gc,新生代500+gc,可以看到内存已经不大够用了,疯狂gc了
  • -Xms4M -Xmx8M ,无法启动项目OutOfMemoryError,内存已经不大够用了,

上述为设置堆的大小,java还有堆外内存,栈等使用内存,所以统一内存就使用windows自带的任务管理器查看。

java: 编译文件大小:19.5mb, 启动服务后,在任务管理器中看到内存使用为105mb

然后是rust: 编译文件大小:10mb, 加upx壳后2.6mb, 启动服务后,在任务管理器中看到内存使用为5.3mb

然后是go: 编译文件大小:19.3mb, 去除调试信息后14.6mb, 加upx壳后4.6mb, 启动服务后,在任务管理器中看到内存使用为4.3mb

总结: 哈哈,这只是一个不太严格的测试,大家勿喷。 看起来内存使用确实是go/rust完败java。 而且打包后的大小一直有点诟病,实际项目每次发包都是100mb起步,上传时间有点令人肉痛。 不过没想到的是,go编译后的文件居然那么大,和java持平了。有点离谱。而且go的内存使用居然只有4.3(这里有点怀疑是刚好被gc回收了哈哈哈)

This post is licensed under CC BY 4.0 by the author.