hengyunabc / jdk-retransformClasses-oom

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

jdk bug

工程导入IDE,设置jvm参数为: -XX:MetaspaceSize=20m -XX:MaxMetaspaceSize=20m -verbose:class , 执行main函数。

过一段时间,可以看到打印错误日志:

java.lang.OutOfMemoryError
	at sun.instrument.InstrumentationImpl.retransformClasses0(Native Method)
	at sun.instrument.InstrumentationImpl.retransformClasses(InstrumentationImpl.java:144)
	at com.example.jdkretransformClassesoom.JdkRetransformClassesOomApplication.main(JdkRetransformClassesOomApplication.java:46)

可以同时开一个 visualvm来观察,可以发现meta space突然一下子用完。


demo 包下的说明

demo包演示了一个 arthas trace之后,应用的meta space快速上升的例子。

导�入IDE,启动 demo.TTT,然后 arthas 3.3.9版本 attach。

as.sh --select TTT --use-version 3.3.9

然后多次 trace

[arthas@72234]$ trace demo.FFF ttt
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 333 ms, listenerId: 1
[arthas@72234]$ trace demo.FFF ttt
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 330 ms, listenerId: 2
[arthas@72234]$ trace demo.FFF ttt
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 154 ms, listenerId: 3
[arthas@72234]$ trace demo.FFF ttt
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 155 ms, listenerId: 4
[arthas@72234]$ trace demo.FFF ttt
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 167 ms, listenerId: 5
[arthas@72234]$ trace demo.FFF ttt
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 134 ms, listenerId: 6
[arthas@72234]$ trace demo.FFF ttt
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 154 ms, listenerId: 7
[arthas@72234]$ trace demo.FFF ttt
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 139 ms, listenerId: 8
[arthas@72234]$ trace demo.FFF ttt
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 151 ms, listenerId: 9

在这过程中,可以用 visualvm 观察到meta space快速上涨。

但这个可以排除和 arthas本身的代码的关联。比如把 arthas生成的字节码dump出来,options dump true

然后不启动arthas,而是用上面的 retransformClasses ,不断加载arthas dump出来的字节码,则很容易复现。所以排掉arthas其它代码可能原因。

About


Languages

Language:Java 100.0%