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

21079 次点击
所在节点    Java
125 条回复
shanai
2024-07-09 15:15:40 +08:00
用 Rust:)
elevioux
2024-07-09 15:53:43 +08:00
装 php 的时候加上 curl 和 mysql 扩展, 一个脚本搞定。然后让 crontab 定时运行 0 10 * * * php script.php 。

不运行,0 占用。
piecezzz
2024-07-09 15:56:53 +08:00
@Goooooos 还真不知道
kenvix
2024-07-09 15:59:34 +08:00
优化内存占用从未是 Oracle JVM 的重点,它们只关注吞吐量
只有 ART 这种移动 JVM 才会稍微关注下这个事情
wysnxzm
2024-07-09 16:06:01 +08:00
@Goooooos #76 唉 学而不思则罔,思而不学则殆
Rever4433
2024-07-09 16:16:29 +08:00
@kuanat 确实,如无必要勿增实体。本来很简单的需求非要用很重的语言和框架来实现,这本身就是错配的。
loopq
2024-07-09 17:20:51 +08:00
@diagnostics #20 瞎说,培训班出来的也知道命令行 javac 直接运行.java 文件,明明连培训班的都不如
edisonwong
2024-07-09 18:02:57 +08:00
shell + cron (doge
Belmode
2024-07-09 18:16:23 +08:00
噫嘘唏呜呼哀哉?
mark2025
2024-07-09 18:19:49 +08:00
@angrylid 就“write once run anywhere”来说,有这么难么,js 不也是 write once run anywhere 么
cdlnls
2024-07-09 18:51:43 +08:00
@yazinnnn0 MySQL InnoDB 缓存大小,也是可以调的默认好像就是几百 M 。。。
9c04C5dO01Sw5DNL
2024-07-09 19:31:52 +08:00
用 rust 重写
yinmin
2024-07-09 19:42:33 +08:00
如果程序不复杂,你可以试试把完整的 java 代码递交给 claude3.5sonnet ,让他改成 python 代码。

python 的启动速度和内存占用都比 java 好些。 甚至你可以让 claude 改写成 sh 脚本试试。

(我试过让 poe 里的 claude3.5-200k 把 cloudflare workers 的 js 完整代码改写成 python ,这货给出的代码居然能一次跑通,然后小细节沟通了几次,自己没写一行代码 100%完美运行)
chainal7777
2024-07-09 19:52:38 +08:00
试试 rust ,可能会变成 9M
bunny189
2024-07-09 20:02:37 +08:00
“我的 hello world 怎么占用了 1 个 G”
hillwall
2024-07-09 23:54:04 +08:00
用 go 或者 node
agdhole
2024-07-10 01:44:05 +08:00
.net 8 aot 见
levelworm
2024-07-10 04:11:06 +08:00
@powerman 感觉楼主这个功能 C 问题也不大,就是不知道微信有没有 C 接口。
msg7086
2024-07-10 04:29:31 +08:00
@cheng6563 #42 有没有可能,「默认」设置是可以改的。
fox0001
2024-07-10 06:28:14 +08:00
这个简单需求,可以用 go ,甚至 shell

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

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

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

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

© 2021 V2EX