Skip to content

Commit

Permalink
Create 2024-11-13-jdk vs go vs rust 最小内存使用.md
Browse files Browse the repository at this point in the history
  • Loading branch information
MisterChangRay authored Nov 13, 2024
1 parent b8911f1 commit 712e0d7
Showing 1 changed file with 46 additions and 0 deletions.
46 changes: 46 additions & 0 deletions _posts/2024-11-13-jdk vs go vs rust 最小内存使用.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
---
layout: post
title: "jdk vs go 启动的最小内存"
date: 2024-11-13 15:29:20 +0800
categories:
- java
- go
- rust
tags:
- 内存使用
---

最近学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回收了哈哈哈)

0 comments on commit 712e0d7

Please sign in to comment.