-
现象:压力测试开始 元空间就疯狂网上涨,最大值从一开始的20m改到了256m 又改到了512m ,但是根本没有用,有多少占多少。
image.png
可以看到 元空间已经满了 ,然后疯狂进行FGC,导致了CPU飙升, 但是并没有什么卵用,所以最后就OOM了。其他Eden和OLD 都挺正常。
看看都加载类些啥:
image.png
这里有一个细节:Class非常多
- 给jvm启动参数加上 -verbose:class 打印类加载信息,可以看到特别多的jaxb的类在被加载,速度很快。
image.png
已经确认,是jaxb的问题。看了一下代码,用的是2.1的包,但是java8要求的版本至少是2.2.8:
image.png
-
果断把包换成2.2.11,重新启动,再次观察:
image.png
方法区已经降到了64m,而且增长很慢。
image.png
Class的数量也由原来的31万降到了1万。
问题解决。 总结
java8+把永久代换成了元空间,那原来元空间的gc机制也有所变化,所以需要特别注意动态代理相关的jar包(像jaxb 、fastjson等 )的版本,用的时候请网上查一下,如果查不到请用较新的版本。 一般这种大厂的包都不需要自己去重写代码,新版本都会兼容对应的java版本。