果然吃内存,一个简单的 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 了,还是这个内存表现,失望啊。

21046 次点击
所在节点    Java
125 条回复
yaott2020
2024-07-09 09:15:32 +08:00
Java 缺陷就是内存大户,个人用肯定 Python/Go 更好
cheng6563
2024-07-09 09:15:47 +08:00
@wysnxzm 照你说的是不是一个物理机只能跑 4 个 Java 程序。
内存占用如此大就是 Hotspot JVM 的设计问题,Hotspot JVM 很不喜欢把已 GC 的内存还给操作系统,换 openj9 就没这问题了
zbatman
2024-07-09 09:15:57 +08:00
Javaer 是这样的,JDK 维护人员只要全身心投入到底层,性能优化,添加新特性就可以,可是 Javaer 要考虑的事情就很多了。
karben
2024-07-09 09:20:25 +08:00
@zbatman 沟槽的公式
kanepan19
2024-07-09 09:22:21 +08:00
企业级代码 亮了,
话说,你可以指定堆内存,当然你这 spring 一套下来,200m 也差不多那样了。
afantwtz
2024-07-09 09:27:13 +08:00
@diagnostics #20 然而这个情况我也会回“不知道”,多一事不如少一事
louisxxx
2024-07-09 09:36:27 +08:00
你换 PHP 是不是就 10M 了
VensonEEE
2024-07-09 09:44:52 +08:00
这种事儿就是 Python 、node 、go 的事儿 ,java 的擅长点在生态利用、以及大型项目的编码组织上。
没有工具是万能的。
tomatocici2333
2024-07-09 09:48:26 +08:00
对于企业来说内存不值钱
Navee
2024-07-09 09:50:06 +08:00
是这样的,可以换 openj9 运行环境,进一步减少内存占用,但还是解决不了“我就提供一个接口为什么占用几十 M 内存”的问题
janda
2024-07-09 09:52:25 +08:00
@kuanat 老哥思路不错、我之前也是陷入这样的泥潭中,一直都是这种固定思维禁锢了
liuhuansir
2024-07-09 09:54:48 +08:00
@Navee 因为 java 就是要占这么多,换语言就可以解决你的问题
wanniwa
2024-07-09 09:55:26 +08:00
@jackmod #27 小工具用 python 写还是快吧,有 Chatgpt 加持。Chatgpt 写代码,python 基本上是最爽的了
LPJD
2024-07-09 09:57:05 +08:00
才 250M?我们起步都是 2G 的
nxcdJaNnmyF9O90X
2024-07-09 09:57:38 +08:00
要编译快 要省内存 直接上 go 吧 适合的语言做适合的事情
zzfly256
2024-07-09 10:03:56 +08:00
在这类数据爬取的定时任务上,轻量点的脚本语言的性价比会更高;
另外不考虑一下利用 linux 的 crontab 吗,考虑到周期为 10 分钟一次的话,常驻进程应该大量时间都在空跑吧
RandomJoke
2024-07-09 10:04:57 +08:00
企业级大部分应用就是承载很多业务了,上手就是几 G 内存了,差距就拉小了,那种业务量很小的,你用个 lua + nginx 写写都行,根本没必要用 java 这种重生态的语言,java 的优势就在于生态非常成熟,就像 spring ,本身是让你依赖管理更加简单,你要是本身应用就很简单,有什么好管理的。
mezhangkai
2024-07-09 10:08:47 +08:00
用 quarkus 和 graal 21 拥抱云原生,压力内存,虽然相比 go 还是有些差距,但还是进步非常多。
w568w
2024-07-09 10:15:41 +08:00
C/Zig/Rust/Go 占内存都小。说到底为什么要吊死在 Java 上?你也知道资源不足,还用企业级的 JVM 。要么 GraalVM 编译为原生,要么等 Kotlin Native 吧。
libook
2024-07-09 10:17:47 +08:00
java 默认是按照你物理内存大小按比例自动分配空间的,有配置内存分配的参数,比如 Xms 和 Xmx ,你看看是不是能解决你的问题。

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

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

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

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

© 2021 V2EX