面试官:如何进行 JVM 调优(附真实案例)_jvm如何调优面试如果回答-CSDN博客
gc 日志 和 Metadata 有关
Metaspace used 35337K, capacity 56242K, committed 56320K, reserved 1099776K
这边简单解释下这几个参数的意义
上述数据可以体现出碎片化的情况。元空间中每个类加载器会直接分配一个Chunck的空间,无论实际使用多少都会占用一个chunck的位置,即使一个 ClassLoader 只加载1个类,也会独占整个 chunk
当出现 used 和 capacity 两者之差较大的时候,说明此时存在内存碎片化的情况
过 dump 堆存储文件发现存在大量 DelegatingClassLoader
通过进一步分析,发现是由于反射导致创建大量 DelegatingClassLoader。其核心原理如下:
在 JVM 上,最初是通过 JNI 调用来实现方法的反射调用,当 JVM 注意到通过反射经常访问某个方法时,它将生成字节码来执行相同的操作,称为膨胀(inflation)机制。如果使用字节码的方式,则会为该方法生成一个 DelegatingClassLoader,如果存在大量方法经常反射调用,则会导致创建大量 DelegatingClassLoader