Java 应用内存不断增长

346 天前
 zx9481

启动参数如下

java -server -Xms2048m -Xmx2048m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/xxx/heapError -jar xxx.jar --spring.profiles.active=prod --server.port=9551

项目启动一周后内存就已经 2.6g 了。。。也没有出现过 oom 异常,请教大家应该如何排查解决呢?

9105 次点击
所在节点    Java
64 条回复
diagnostics
345 天前
@joyhub2140 哥们,线程不占内存?
diagnostics
345 天前
-XMX 定好了,那大概率是堆外,不确定你这是 RSS ,还是 COMMITED 的 2.6G ,建议开 NMT 然后看一下

假如没有 native memory leak ,大概率是有线程泄漏了,导致内存泄漏了
diagnostics
345 天前
@JYii #28 层次是和别人对比出来的

例如你觉得自己底层厉害,想找基础框架的,那么和基础框架组的人对比,你的能力是什么范围,懂底层的多少东西,如果只会内存泄漏这一个,其他的不熟悉,那你定级就比较低。假如你 JVM 精通、线程模型精通、数据结构精通,网络精通,那又是另一个层面。

排查问题是一种能力,根据知识来设计软件架构又是一种能力
twofox
345 天前
@nothingistrue 我觉得你说的有道理。xmx 确实只限制堆内存。内存的问题就应该交给 JVM 处理。再怎么调优都比不过新的 jdk 带的垃圾收集器

优先排查代码问题,再考虑 JVM 调优

知乎的这篇文章可能对 OP 有帮助
https://zhuanlan.zhihu.com/p/432258798
JYii
345 天前
@diagnostics #43 OK 了解,多谢回复,学习成长路漫漫。(后面几个精通给我干懵了
chenfang
345 天前
2.6G 如果不出现内存报警,要么你的 2.6G 不准,要么有堆外内存(比如 netty 可以创建堆外内存),

同时也建议看看 gc 次数频繁不频繁

你也说了是一周之后 2.6G,但是这个并没有什么参考,你需要看这一周的内存变化,来分析情况
ASpiral
345 天前
起个定时任务强制 full gc ,都不用重启了/dog
nananqujava
345 天前
先升级 jdk 版本看看
iamhucong
345 天前
多对比几次 smaps 看堆外内存有没有持续上涨
Dongxiaohao
345 天前
@JYii 笑死了,当初我们开发的一个项目,根据模板渲染 Excel 表格,里面的图片很多(五六十张吧),最后转成 PDF 导出,导致这个接口但凡调用一次就 fullgc 几次,最后找不出问题就写了个定时任务隔一段时间重启服务😂
JYii
345 天前
@Dongxiaohao #50 fullGC 频繁,代码不太烂的话,加内存就好了。(省心省力
ZSeptember
345 天前
没有监控吗。
一般就是 dump 下来,使用 memory analyzer 分析一下
qiubinren
345 天前
项目里面有自己用 netty 直接内存池进行分配和释放么?用了加-Dio.netty.leakDetection.level=PARANOID 参数,检测下 netty 侧内存有没有泄漏,隔段时间在日志里搜 LEAK 就行了。
如果没有直接玩 netty 内存池,加 @salmon5 #17 提到的参数分析 NMT ,多收集几次,看下具体哪个区域在不断增大,收集更多的信息,另外最好把 jdk 版本贴出来,遇到过 openjdk 连续几个小版本反射导致内存泄漏,如果 jdk 小版本版本号太小,最好直接升级到小版本较高的版本
zx9481
345 天前
感谢 项目中没有用到 netty 我去加启动参数看看
qiubinren
345 天前
@zx9481 我上面没有细看你的命令,直接断定你的程序存在直接内存泄漏,这其实不太对。又看了眼你的命令,堆内存给了 2G ,一周跑下来 2.6G ,其实感觉很可能是正常的,因为命令里只限制堆内存,其他区域并没有任何限制,至少把 MaxDirectMemorySize 、ReservedCodeCacheSize 、MaxMetaspaceSize 这几个参数填了。如果还限制不住,可以考虑增加-Djdk.nio.maxCachedBufferSize 、-DMALLOC_ARENA_MAX 、-DMALLOC_MMAP_THRESHOLD_这些参数的配置,并且给比较小的值,如果还是不断增长,再考虑内存泄漏。
duron600
345 天前
而内存的总量保持不变。
susuper
345 天前
是如何确认内存不断增大呢,通过 top 吗
hancai
345 天前
老生常谈的问题了, k8s limit pod 的内存限制, 触发 OOM 就释放了,就是这么粗暴。
Ericcccccccc
345 天前
先 dump 简单分析下再看其它问题.
PDX
345 天前
@wxw752 有 buffer 没释放掉

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

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

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

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

© 2021 V2EX