MetaSpace
元空间内存不足,Matespace元空间应用的是本地内存
-XX:MetaspaceSize 的处理化大小为20M
#### 元空间是什么
元空间就是我们的方法区的实现,存放的是类模板,类信息,常量池等
Metaspace是方法区HotSpot中的实现,它与持久代最大的区别在于:Metaspace并不在虚拟内存中,而是使用本地内存,
也即在java8中,class metadata(the virtual machines internal presentation of Java class),
被存储在叫做Matespace的native memory
永久代(java8后背元空间Metaspace取代了)存放了以下信息:
- 虚拟机加载的类信息
- 常量池
- 静态变量
- 即时编译后的代码
模拟Metaspace空间溢出,我们不断生成类 往元空间里灌输,类占据的空间总会超过Metaspace指定的空间大小
为了更快的达到效果,我们首先需要设置JVM启动参数
-XX:MetaspaceSize=8m -XX:MaxMetaspaceSize=8m
public class MetaspaceOutOfMemoryDemo {
// 静态类
static class OOMTest {
}
public static void main(final String[] args) {
// 模拟计数多少次以后发生异常
int i =0;
try {
while (true) {
i++;
// 使用Spring的动态字节码技术
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(OOMTest.class);
enhancer.setUseCache(false);
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
return methodProxy.invokeSuper(o, args);
}
});
}
} catch (Exception e) {
System.out.println("发生异常的次数:" + i);
e.printStackTrace();
} finally {
}
}
}
------------------
报错:
发生异常的次数: 201
java.lang.OutOfMemoryError:Metaspace
十四、性能监控分析、线上问题定位处理