jvm 内存分析,服务器内存不足会导致 Java 程序卡死吗

2018-12-04 15:51:07 +08:00
 Asice

visualVM 信息 tcp 信息,排除端口占用满了的问题

因为卡的时候我看了控制台日志是服务器在 api 请求,然后日志打印也是卡住,2 秒打印一条信息。
之前一直在 GC 导致 cpu100%,调了下 jvm 分配 5g,总 8g。mysql 和服务器用剩余 3g。
现在 cpu 降到 20-50 了,但是还是卡死,内存不足的原因吗? jvm 内存给多了?

5058 次点击
所在节点    Java
24 条回复
Asice
2018-12-04 16:00:16 +08:00
sagaxu
2018-12-04 16:10:46 +08:00
有 gc log 吗?
peyppicp
2018-12-04 16:18:24 +08:00
这 jvm cpu 占用才 1%。考虑下是不是线程阻塞在业务逻辑上了。
这种 cpu 占用,要么没请求量,要么都阻塞了。
jstack 看一哈
Asice
2018-12-04 16:24:27 +08:00
@peyppicp 之前 jvm 默认没带参数,直接 GC 100cpu,现在分配堆内存 5g 还是卡死,但是不是 GC 卡死了。现在分配改 4g,应该还是卡死。
现在推测
1.内存不足
2.带宽问题,但是我 ping 是没问题,只是阿里云监控带宽是占满的
fmumu
2018-12-04 16:30:20 +08:00
gc 太频繁了吧
Asice
2018-12-04 16:30:51 +08:00
@peyppicp 不应该是堵塞,线程数都没上去,峰值 600 多的线程数
Asice
2018-12-04 16:32:32 +08:00
@fmumu 之前就是 gc 频繁 cpu100,现在分配堆内存就没 100%问题了
peyppicp
2018-12-04 16:34:02 +08:00
带宽跑满 瓶颈在网络 IO 啊。
用 iftop 命令看一下,是不是 jvm 把服务器带宽跑满
AiLinkLife
2018-12-04 20:19:23 +08:00
程序卡死内存过高 jvm 内存不要设置太高影响机器性能找到你垃圾回收机制频繁的原因,频繁回收会导致程序卡顿
pursuer
2018-12-04 21:34:09 +08:00
会是有内存泄漏吗?
szq8014
2018-12-05 08:29:07 +08:00
怎么个卡死法? jstack 看看线程们都在干什么
Asice
2018-12-05 09:39:37 +08:00
@szq8014 目前 cpu 很低,我也不知道 jstack 能看什么,之前 100% 还能根据线程 id 看什么线程导致 100%。现在 cpu 没问题了,jstack 感觉就没切入点了。
目测带宽问题,做了多线程图片中转
Asice
2018-12-05 09:41:42 +08:00
@AiLinkLife jvm 参数慢慢调吧,这个东西也没人教你的,都是自己慢慢尝试的
szq8014
2018-12-05 09:53:52 +08:00
@Asice 看线程有没有在等 lock 啥的,万一不是服务器的锅而是代码有问题呢~
Asice
2018-12-05 10:44:24 +08:00
@szq8014
jstack 78 个线程,只有 3 种状态,RUNNABLE,WAITING,TIMED_WAITING。
现在也排除带宽问题了,刚卡的时候带宽不到 1m
见鬼,难道 gc 的问题
Asice
2018-12-05 10:48:30 +08:00
Locked ownable synchronizers:
- locked <34e8f9d1> (a java.util.concurrent.ThreadPoolExecutor$Worker)
好像是线程池死锁了
Asice
2018-12-05 10:51:40 +08:00
但是我不明白的问题是就算死锁了,cpu 占用不高,线程也才 78 个。不是应该还能运行。
这个线程池是独立的一个部分,不会影响业务的,业务的线程应该还是能运行的
luosuosile
2018-12-05 10:59:29 +08:00
如果你是频繁 gc,应该是老年代内存分配不足,
老年代内存分配不足,会导致 fullgc 过多,这种 gc 耗时很长,会让整个 jvm 的程序停下来。
你直接增加 jvm 内存,jvm 会不会增大老年代的内存并不知道。
你应该增加 jvm 合适的内存大小,然后输入 jvm 指令增大老年代内存。这样应该可以解决频繁 gc 的问题。
如果明显有效果,之后能跑就可以不用动了。
但是感觉还不够就再调整新生代以及新生代的两个 surrvior 区的比例。
luosuosile
2018-12-05 11:01:10 +08:00
我也就一年经验,没有调试过 jvm,但是看过深入了解 jvm,所以就参考一下吧。最喜欢楼主这种能学到东西的帖子了
也许你该把 jvm 的内存分配信息发出来给大家看。
q397064399
2018-12-05 11:57:33 +08:00
@luosuosile #18 应该先定位一下 什么对象创建了这么多年 而且会进入老年代,进入老年代 都是老油子 在 minor GC 下活下来好几次的老家伙

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

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

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

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

© 2021 V2EX