回答
元空间溢出一般都是由于应用程序加载过多的类信息引起的。大致情况有如下几种:
- 类加载过多
如果我们在应用程序中大量使用动态代理、字节码生成库(如 Javassist
或 CGLIB
),频繁生成新类,则可能会耗尽元空间。
- 反射
和动态代理一样,如果我们在应用程序中大量使用反射,则也会导致元空间溢出。比如在循环中使用反射。
- 类加载器泄露
如果我们自定义的类加载器没有被及时回收,或者引用了被加载的类,则也会造成元空间溢出。
在实际生产过程中,大明哥遇到过反射和自定义类加载器而导致的元空间溢出。关于元空间的溢出排查,这两篇文章不错,各位小伙伴可以参考参考: