jvm 元空间
java8 开始使用元空间(元空间使用本地内存)代替永久代实现方法区;
用来存储类信息、即时编译器编译后的热点代码等数据;
注意:java7开始在堆内存中存储常量池、静态变量
******************************
相关参数
-XX:MetaspaceSize:设置元空间的初始大小,默认为20.8M
-XX:MaxMetaspaceSize:设置元空间的最大值
-XX:MinMetaspaceExpansion:metaspace扩容的最小增量
-XX:MaxMetaspaceExpansion:metaspace扩容的最大增量
-XX:MinMetaspaceFreeRatio:剩余空间占比最小值,默认40,gc后剩余空间占比低于设定值值扩容
-XX:MaxMetaspaceFreeRatio:剩余空间占比最大值,默认70,gc后剩余空间占比高于设定值缩容
******************************
示例:元空间溢出测试
public class Test {
public static void main(String[] args){
for (int i=0;i<10000;i++){
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(Test.class);
enhancer.setUseCache(false);
enhancer.setCallback((MethodInterceptor) (o, method, objects, methodProxy) -> methodProxy.invokeSuper(o,objects));
System.out.println("metaspace test"+i);
enhancer.create();
}
}
}
*******************
虚拟机参数
-XX:MaxMetaspaceSize=20m
*******************
控制台输出
部分输出
metaspace test1620
metaspace test1621
metaspace test1622
metaspace test1623
metaspace test1624
metaspace test1625
metaspace test1626
Exception in thread "main" org.springframework.cglib.core.CodeGenerationException: java.lang.OutOfMemoryError-->Metaspace
at org.springframework.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:506)
at org.springframework.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:363)
at org.springframework.cglib.proxy.Enhancer.generate(Enhancer.java:582)
at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData.get(AbstractClassGenerator.java:131)
at org.springframework.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:319)
at org.springframework.cglib.proxy.Enhancer.createHelper(Enhancer.java:569)
at org.springframework.cglib.proxy.Enhancer.create(Enhancer.java:384)
at com.example.demo.test.Test.main(Test.java:19)
Caused by: java.lang.OutOfMemoryError: Metaspace
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.System$2.defineClass(System.java:2193)
at java.base/java.lang.invoke.MethodHandles$Lookup.defineClass(MethodHandles.java:975)
at java.base/jdk.internal.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:567)
at org.springframework.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:501)
... 7 more
说明:元空间内存不足,抛出OutOfMemoryError