Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Trace 大方法导致JVM metaspace OOM的问题 #1510

Closed
1 task
kylixs opened this issue Sep 18, 2020 · 11 comments
Closed
1 task

Trace 大方法导致JVM metaspace OOM的问题 #1510

kylixs opened this issue Sep 18, 2020 · 11 comments

Comments

@kylixs
Copy link
Contributor

kylixs commented Sep 18, 2020

  • 我已经在 issues 里搜索,没有重复的issue。

环境信息

  • Arthas 版本: 3.3.0 ~ 3.4.1

重现问题的步骤

1、trace Java应用的一个较大方法(100行以上),通过dashboard命令/jconsole可以看到JVM的metaspace增加非常快,每次几十MB,执行几次就导致Metaspace OOM。

2、reset 恢复增强的类,通过ognl调用gc ,但不能回收Metaspace的内存。
ognl @java.lang.System@gc()

@hengyunabc
Copy link
Collaborator

hengyunabc commented Sep 18, 2020

  1. 不断触发 retransformClasses,然后meta space不断上涨是jdk本身的bug,不使用arthas也能重现:
    https://github.com/hengyunabc/jdk-retransformClasses-oom

  2. 这个pr缓解了arthas自身的trace big method之后 meta space上涨的速度。但仍然是有问题的,trace jdk-retransformClasses-oom里提供的Demo可以重现

@kylixs
Copy link
Contributor Author

kylixs commented Sep 19, 2020

这里有所混淆了,此时是两个不同的问题:

  1. 每次restransform class metaspace都会增加一些,但增加的很少,小于100KB,一般情况下这个bug影响不严重,执行上百次才增加10MB,问题不是很大。
  2. athas 3.3更换bytekit 之后,trace 大方法每次可能增加几十MB甚至几百MB metaspace ,极端情况下执行一次就可以导致OOM

@kylixs kylixs closed this as completed Sep 23, 2020
@joooohnli
Copy link

用最新版3.4.4,依然能够复现

@kylixs
Copy link
Contributor Author

kylixs commented Dec 3, 2020

用最新版3.4.4,依然能够复现

@joooohnli 可以提供一个例子吗?
之前的OOM例子已经是修复了,可以参考这篇文章:https://developer.aliyun.com/article/777487

@joooohnli
Copy link

image

trace这个100行的test()方法,从进入arthas到trace17次之后,metaspace从1M升到43M

image

@kylixs
Copy link
Contributor Author

kylixs commented Dec 3, 2020

trace这个100行的test()方法,从进入arthas到trace17次之后,metaspace从1M升到43M

每次增强字节码会有一定的开销,JVM回收Metaspace不是很及时的。40多M应该还是在正常的范围内,不断的trace,Metaspace是否会继续增加?

@joooohnli
Copy link

image

会继续增加。截图是在12:00和12:30分别trace了20次左右,最终上升到120M。

@kylixs
Copy link
Contributor Author

kylixs commented Dec 3, 2020

会继续增加。截图是在12:00和12:30分别trace了20次左右,最终上升到120M。

可以提供一下example的代码吗? 我分析一下Metaspace的消耗情况

@joooohnli
Copy link

@kylixs
Copy link
Contributor Author

kylixs commented Dec 4, 2020

会继续增加。截图是在12:00和12:30分别trace了20次左右,最终上升到120M。

操作系统及Java的版本? 我在macOS + Java 11 测试trace 80次,Metaspace稳定在59.5MB

@kylixs
Copy link
Contributor Author

kylixs commented Dec 4, 2020

对比测试Java 1.8 和 11。

测试脚本:

#!/bin/bash

max_times=100
for (( i=1;  i <= $max_times; ++i))
do

echo "test $i .."

curl -Ss -XPOST http://localhost:8563/api -d '
{
  "action":"exec",
  "execTimeout": 500,
  "command":"trace test.Test test"
}
'
echo ""

done

分别执行3次脚本,即trace 300次,结果如下:

Java 1.8测试结果:
ygc 次数不多,但出现多次fgc。Java 的Metaspace上涨很快,可能是回收不及时,貌似ygc不能回收Metaspace?
image
image

Java 11测试结果:
ygc次数非常多,没有发生fgc。测试几百次后Metaspace仍然稳定在50MB。

image

结论:
Java 11以上极大优化了JVM Metaspace的内存回收,如果遇到Metaspace OOM问题,可以尝试升级JDK。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants