generated from cotes2020/chirpy-starter
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Create 2024-11-13-jdk vs go vs rust 最小内存使用.md
- Loading branch information
1 parent
b8911f1
commit 712e0d7
Showing
1 changed file
with
46 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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回收了哈哈哈) |