Java 应用内存不断增长

345 天前
 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 异常,请教大家应该如何排查解决呢?

9103 次点击
所在节点    Java
64 条回复
me1onsoda
345 天前
@wxw752 @jorneyr netty 这种应用内存就是跟着连接数涨的,吃的是堆外内存,一条连接一个读写缓冲区。gc 管不着
burymme11
345 天前
@wxw752
巧了,我们把网关升级到 spring gateway 之后,也出现这问题,就是 netty 申请的堆外内存导致的。
Scarb
345 天前
2.6G 内存,超过堆内存的上限 2G ,堆外内存泄漏了。先 smaps 看下堆内存占用多少,算出堆外内存占用。堆外内存如果没特殊配置,最大也只能占 2G ,可能很快就 OOM 了。

堆外内存很难定位泄漏点,给一个参考:
https://tech.meituan.com/2018/10/18/netty-direct-memory-screening.html

实在不行只能把内存用 gdb dump 出来,然后强行查看里面的内容,推测可能的泄漏原因。
salmon5
345 天前
@Scarb #23 你说的这个,又是 smaps ,又是 gdb ,大部分的 java 开发不懂
salmon5
345 天前
@salmon5 不是人均阿里 P7 P8 水平,大部分还是 CRUD
aLazarus
345 天前
@salmon5 #24 不过还是可以学到知识
LowBi
345 天前
哈哈哈 我的是内存正常 但是十几天后占用内存变小 随后宕机 问题是内存泄露 高并发的读取数据库导致有些线程超时未能关掉 好烦 不多线程的话 方法执行完需要三分多钟 现在还没想到长期运行的办法
JYii
345 天前
@salmon5 #24 想问下排查内存泄漏这种问题对于 Java 开发是什么层次。
曾经解决过公司一个服务的内存泄漏,堆外问题确实很难定位到,从简单的 NativeMemoryTracking ,pmap 查看内存分配,监控栈函数调用,jeprof 对比堆内分配,最终定位到框架的问题,确实在对应版本 issue 中找到,升级后解决。
trcnkq
345 天前
* JVM 不是它需要多少内存,才占用多少内存;而是在 -Xmx 允许的前提下,只要你系统还有空余,它就会大方地申请占用;而且即使之前申请了,后续不需要这么多了,它也不会及时退还给 OS ;
* 你可以通过 jhsdb jmap --heap --pid ${jvm_pid} 来确认你的应用当前实际只 需要/占用 多少内存;
* 如果你希望让 JVM 需要多少内存,才占用多少内存,多占用了就及时释放,可以通过调整 -XX:MinHeapFreeRatio -XX:MaxHeapFreeRatio 来实现。
trcnkq
345 天前
当然上面所说,前提是你的应用没有内存泄漏。
JYii
345 天前
@salmon5 #24 对于一些非重要服务,楼上的低频时段重启确实简单暴力,排查内存泄漏问题起码两周起步
salmon5
345 天前
@JYii #28 P7 P8 我说的可能有点夸张了,但实际中大部分 Java 开发不会(不想浪费时间或者没有能力)这么排查,大部分就是扩容服务器、容器内存+定期重启解决
storyxc
345 天前
@Scarb 学到了
nothingistrue
345 天前
-Xms -Xmx 限制的是堆内存,JVM 不止有堆内存,JVM 内存大于 Xmx 是正常情况。

堆内存只是用来存储对象的成员变量的,对象的方法运行期间使用的基本类型变量(包括数组),要占用栈内存,这些是随运行动态申请和释放的。如果是服务器负荷期间内存升高,无需理会,负荷降了就会自己下去。

Java 类定义,类的成员方法的函数定义,类的静态变量,也是要占用内存的。这些内存通常是一旦加载就不会释放(具体取决于类加载器),这种情况会导致 JVM 启动一段时间后内存就略微增长。但这种情况也请无需理会,首先这是 JVM 的职责,其次就算它真是屎山你也不该去碰。
JYii
345 天前
@salmon5 #32 我没有大厂经验,想了解下现在的行情。年后要重新找工作(允悲
ChaYedan666
345 天前
堆外内存设置 JVM 管不着,项目迭代快就懒得管了(基本一两周就会上线一次),没崩就行
Arumoh
345 天前
换 openj9
SilenceLL
345 天前
看内存快照,里面看下 dominator_tree 最大对象是不是有啥问题
joyhub2140
345 天前
很好奇,都说堆外内存泄露的,难不成都是用 jni 开发 Java 项目嘛?
falsemask
345 天前
你的 jdk 版本号多少,我遇到过 java8 低版本 bug ,会导致堆外内存一直涨

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

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

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

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

© 2021 V2EX