果然吃内存,一个简单的 Java 程序就占用了 250M 内存

2024-07-08 20:36:54 +08:00
 karottc

之前一直在用 Java 写 企业级代码,并没有很在意 java 的内存问题,比如多个/少个一两百兆就没关心。

平时用 java 写的直接运行就结束的代码,基本都是本地电脑运行,也没有发现内存问题。

直到最近,用 java 写了一个简单的程序,运行在我的 1C1G 的腾讯云机器上,才发现 java 确实内存大户。

程序的功能为:

  1. 每 10 分钟抓取某个链接的数据
  2. 抓取到的内容和 mysql 里面已有的内容作对比
  3. 存在就更新,不存在就插入到 mysql 中
  4. 每天早上 10 点发送一个企业微信通知

这就是这个程序的所有功能,由于用到了定时任务和操作 mysql, 所以我第一个版直接用了 springboot ,平时工作也用整起来快。 用到的库为:okhttp + gson + mybaits + jdbc + logback

程序运行稳定之后内存占用:250M

这个简单的功能这个内存占用实在是太大了。

然后我觉得可能是 springboot 的原因,所以我写了第二版: 用了 okhttp + gson + mybatis + jdbc 去掉了框架和 logback, 直接用 print 输出 log , 定时任务也直接用了 while(true) + sleep 来实现。

这版程序稳定运行之后内存占用:90M

上面两版没有加任何优化参数,就是 java -jar xxx.jar 运行。 java 版本:java21


java21 了,还是这个内存表现,失望啊。

21053 次点击
所在节点    Java
125 条回复
raptor
2024-07-09 10:21:00 +08:00
@Rorysky 差很多。我司原来的产品就是 python 写的,后来因为招不到人换 java ,内存使用大了四五倍都不止,不过反正硬件是客户提供的……
Nitsuya
2024-07-09 10:29:53 +08:00
我 N1 跑着各种代码, 差不多 400M.


X86 用 GraalVM 做 native 吧.
Torpedo
2024-07-09 10:34:39 +08:00
淡定,之前在快手,听服务端的说公司 java 框架启动要 8g 以上的内存。
x2ve
2024-07-09 10:52:19 +08:00
内存和带宽受限时,那种感觉是真难受。要是有能完美模拟浏览器行为且内存开销特别小的工具就好了
caqiko
2024-07-09 10:54:27 +08:00
相比之下一个 MySQL 就要 500MB 不是更吃惊了吗
wysnxzm
2024-07-09 11:00:19 +08:00
@cheng6563 #42 https://stackoverflow.com/questions/60107793/why-default-java-max-heap-is-1-4th-of-physical-memory 这是 stackoverflow 上对于 jvm 默认内存大小的一个讨论,其中提到从 jdk5 开始就是如此

jvm 默认使用 1/4 内存对不对且不说,你要是有疑问完全可以给 jdk 开发者提 issue 我非常支持

但是都是用 jdk21 了还不知道一个从 jdk5 延续至今未变更的特性,这很不合常理吧?
joyhub2140
2024-07-09 11:01:43 +08:00
springboot 已经是大规模企业级框架了,默认集成的组件也不少。

介意内存的话,Java 也有很多小而美的框架。
meteora0tkvo
2024-07-09 11:07:41 +08:00
想要性能得用 go
blackmirror
2024-07-09 11:11:05 +08:00
用 java 根本就不考虑小内存,小内存根本不会用 java
zhouhu
2024-07-09 11:19:52 +08:00
要看内存实际使用情况吧,Java 申请了 256M ,不一定全部使用了,如果使用率较低,可以使用 xmx 限制一下最大内存。
zhouhu
2024-07-09 11:24:04 +08:00
@zhouhu 这种小程序估计 128M 能够起得来
Chinsung
2024-07-09 11:44:18 +08:00
画个靶子自己打可还行,你这个诉求你既然对内存有要求就用 c 和 go ,用 java 就要考虑 GraalVM 。
你这个例子我可以用来吐槽任何语言。反正把那个语言的短板拿来直接套就完事了
herewego
2024-07-09 11:44:44 +08:00
.NET,php 30M 就够了
highFreqSurfer
2024-07-09 11:57:14 +08:00
go 开发路过, 但建议用 nodejs (狗头
yazinnnn0
2024-07-09 11:58:36 +08:00
用 quarkus+graalvm 试了一个简单 demo





放 docker 容器里, 给 20M 内存就能愉快运行了



让我震惊的是 mysql 啥也不干就吃掉 400+M 内存
Goooooos
2024-07-09 12:16:50 +08:00
@wysnxzm 我猜那些学了几年 JAVA 的人都不知道,不指定堆大小的时候,默认最大机器内存的 1/4 。
Features
2024-07-09 13:43:42 +08:00
功能比你复杂很多的 php cli ( workerman )脚本,占用 5.3 MB
dode
2024-07-09 14:44:09 +08:00
go 写,内存可以回收,java 内存占的是全生命周期内存需求最大的内存,不会释放回操作系统
satoru
2024-07-09 15:08:13 +08:00
大量 JVM 微服务,老板会很开心
cmsyh29
2024-07-09 15:09:55 +08:00
主要是 boot 自带了很多对象。其实你往上加一些正常业务,内存也不会涨的很明显

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1055770

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX