写了一个 springboot 的小采集程序,使用了 netty (采集 tcp 协议数据)、jpa (保存数据库)。
占用内存为什么这么高呢,是不是需要优化,删除没用的包什么的。
我其他用 纯 java 实现的 同样功能的采集程序,只占 200M 左右(下图 colloect 开头的,和 route 开头的)。
其他的用 node 实现的就更小了,第二张图,同样的功能 java 和 node 程序内存占用对比。node 只有 30 几 M 。
springboot 和其他 java 程序:
java 程序和 node 程序:
1
Cooky 2020-09-24 07:44:16 +08:00 via Android
spring 就是这么大!
|
2
zachlhb 2020-09-24 07:58:07 +08:00 via Android
没错,就是这么骚气
|
3
SoulSleep 2020-09-24 08:02:30 +08:00
2 个 G 有点多了吧,如果只是爬虫,100-200M 应该是够了的,加了 jpa 和 netty 的包大概也就多几十 M
所以 300M-500M 足够.... 一个是看你是否给 jvm 分的多了... 另外 netty 是不是没释放资源,这个涉及到堆外内存的使用 我理解的是这样,如有不对楼下补充 |
4
des 2020-09-24 08:13:17 +08:00
据说是默认会吃掉四分之一的内存,另外 springboot 确实是很吃资源
|
5
supermoonie 2020-09-24 08:17:09 +08:00 via iPhone
我用 netty 写了一个抓包工具,用 springboot 保存 req res 数据并负责展示,运行下来也就 700 多 M,你这个怕是内存没管理好吧,内存分析工具分析下,看看占用内存的是哪些对象
|
6
des 2020-09-24 08:17:50 +08:00
找到四分之一的说法的来源了
https://stackoverflow.com/questions/38564648 |
7
hand515 2020-09-24 08:33:06 +08:00
带上 JVM 参数才好分析
|
8
wangyanrui 2020-09-24 08:36:04 +08:00 via Android
不限内存大小,默认最大为机器内存的四分之一
手动 gc 一下估计能少不少😂 |
9
cheng6563 2020-09-24 08:44:17 +08:00 via Android
用-Xmx 限制内存使用
用 g1gc |
10
passerbytiny 2020-09-24 08:46:09 +08:00 via Android
JVM 默认占用物理内存的 4/1 至 1/2,可手动调控——这是 Java 人员的基本功。
|
11
free9fw 2020-09-24 08:57:42 +08:00
java 本来就是上个世纪的,又老又笨重,打印个值都要写一大串。。。什么时候淘汰它
|
12
selfcreditgiving OP @des 默认分配那么多内存啊。服务器是 32g 内存的,已经跑了很多 docker 容器了,这个程序是直接跑在宿主机上的。
如果按比例分配是不是要放在容器里就会占用少一点。 |
13
selfcreditgiving OP |
14
SingeeKing 2020-09-24 10:55:15 +08:00 via iPhone 1
@selfcreditgiving 没必要专门为了这个放容器,可以直接调 JVM 参数的
|
15
blackboom 2020-09-24 10:58:36 +08:00 1
springboot 吃内存,可以选择 OpenJ9 表现明显。
|
16
594duck 2020-09-24 11:21:36 +08:00 1
|
17
mazyi 2020-09-24 12:39:24 +08:00 via iPhone
水平差别怪框架
|
18
azygote 2020-09-24 16:44:59 +08:00 via iPhone
估计是内存泄露了
|