写了一个 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 Finest 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 PRO ![]() @selfcreditgiving 没必要专门为了这个放容器,可以直接调 JVM 参数的 |
![]() | 15 blackboom 2020-09-24 10:58:36 +08:00 ![]() springboot 吃内存,可以选择 OpenJ9 表现明显。 |
![]() | 16 594duck 2020-09-24 11:21:36 +08:00 ![]() |
![]() | 17 mazyi PRO 水平差别怪框架 |
![]() | 18 azygote 2020-09-24 16:44:59 +08:00 via iPhone 估计是内存泄露了 |