由于我在压测的时候 qps 一直不达标(现在接近 300,但要求是 500 )。在阿里的 apm 上查看有慢事务,点进去以后感觉有点奇怪,除了核心业务代码之外还有很长时间不知道耗费在哪。
阿里的技术人员说可能是因为 gc 的问题,观察 jvm 监控,发现垃圾回收时间确实有点长:
fullgc 上耗时接近 4s,请教一下懂这个的大哥帮我分析分析哈。
jvm 参数:-Xms30g -Xmx30g -Xmn20g
jmap 查看如下图:
1
anthow 2018-01-16 17:25:57 +08:00
30g...
|
2
jadec0der 2018-01-16 19:55:00 +08:00
对你的内存来说,这个时间并不长,你应该想办法避免 FullGC。或者是控制 FullGC 的时候摘掉流量
|
3
neoblackcap 2018-01-16 20:02:10 +08:00
30G 的内存是不是可以无脑推 JDK8 以上呢?毕竟 G1 我记得是用 CPU 换更低的回收时间
|
4
feverzsj 2018-01-16 20:07:06 +08:00
你虚拟机内存多大啊,一般这种大都是 virutal memory trashing
|
5
honeycomb 2018-01-16 23:56:08 +08:00 via Android
这么大的堆,试试 G1 ?
|
6
coolcfan 2018-01-17 00:37:36 +08:00 via Android
让 JVM 输出 GC Log,告诉你 Full GC 的原因
|
8
pank OP @neoblackcap 我换了 G1 以后 fullgc 倒是没有了,youngGC 又上去了。。。,qps 还下去了。
|
11
neoblackcap 2018-01-17 11:34:27 +08:00
@pank 不想自己继续搞的话,上 Azul 的 Zing JVM 吧,4T 都能保持在 10ms 一下。不过啊,我觉得你可能还是打一下 snapshot 之类的看看堆里面到底是什么对象比较多,为什么那么容易触发 gc,是内存泄漏了,还是自己的程序有问题。确定程序没有问题再调优吧。
要不然你程序有问题,上了 Zing JVM 也是用钱搞定而已 |
12
kiddult 2018-01-19 12:38:13 +08:00
-Xmn 设置小一些,比如 1G 或者 2G,自己试验一下比较好,youngGC 多点问题不大,时间不会耗在这上面多少,太大了会导致 GC 时间太长
QPS 先看看没有 GC 的那段时间是多少,一般和 GC 关系不应该太大才对,GC 占用程序的总时间比例很小的 |