1.JAVA虚拟机堆内存溢出OutOfMemoryError

1.1设置参数

-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError  最小堆的大小20m  最大堆大小20m

 

1.2代码

public static void t1(){
        List<Test> li = new ArrayList<>();
        while (true){
            li.add(new Test()); //不断的创建对象
        }
    }

 

1.3执行结果

Java heap space:堆内存
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid10972.hprof ...
Heap dump file created [28518346 bytes in 0.143 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:3210)
    at java.util.Arrays.copyOf(Arrays.java:3181)
    at java.util.ArrayList.grow(ArrayList.java:265)
    at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:239)
    at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:231)
    at java.util.ArrayList.add(ArrayList.java:462)
    at com.ruoyi.room.manager.web.controller.Test.main(Test.java:11)

 

2.JAVA虚拟机栈StackOverflowError

2.1设置参数

-Xss128k   每个线程的栈128k

 

2.2代码

public static void t2(){
        t2(); //不断地调用方法,生成栈帧
    }

 

2.3执行结果

Exception in thread "main" java.lang.StackOverflowError
    at com.ruoyi.room.manager.web.controller.Test.t2(Test.java:22)
    at com.ruoyi.room.manager.web.controller.Test.t2(Test.java:22)
    at com.ruoyi.room.manager.web.controller.Test.t2(Test.java:22)

 

3.字符串常量池

3.1设置参数

-XX:MetaspaceSize=18M -XX:MaxMetaspaceSize=18M   元空间大小18m  最大18m

 

3.2代码

public static void t3(){
        Set<String> s = new HashSet<>();
        int i = 0;
        while (true){
            s.add(String.valueOf(++i).intern()); //不断地创建字符串
        }
    }

 

3.3执行

发现一直可以执行,说明字符串常量池不在元空间中

 

3.4再次设置

-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError  最小堆的大小20m  最大堆大小20m

 

3.5执行

Java heap space :堆内存,说明字符串常量池在堆内存中
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.HashMap.resize(HashMap.java:704)
    at java.util.HashMap.putVal(HashMap.java:663)
    at java.util.HashMap.put(HashMap.java:612)
    at java.util.HashSet.add(HashSet.java:220)
    at com.ruoyi.room.manager.web.controller.Test.t3(Test.java:28)
    at com.ruoyi.room.manager.web.controller.Test.main(Test.java:9)
Disconnected from the target VM, address: '127.0.0.1:8574', transport: 'socket'

Process finished with exit code 1

 

3.6测试

String str1=new StringBuilder("计算机").append("软件").toString();
System.out.println(str1==str1.intern());
 
String str2=new StringBuilder("ja").append("va").toString();
System.out.println(str2==str2.intern());

  这段代码在JDK1.6中运行,会得到两个 false,而在JDK1.7中运行,会得到一个true和一个 false。

  在JDK1.6中, intern()方法会把首次遇到的字符串实例复制到永久代中,返回的也是永久代中这个字符串实例的引用,而由 StringBuilder创建的字符串实例在Java堆上,所以必然不是同一个引用,将返回 false。

  JDK1.7及以上(以及部分其他虚拟机,例如 JRockit)的 intern()实现不会再复制实例,只是在常量池中记录首次出现的实例引用,因此 intern()返回的引用和由 StringBuilder刨建的那个字符串实例是同一个。对st2比较返回 false是因为“java”这个字符串在执行 StringBuilder.toString()之前已经出现过,字符串常量池中已经有它的引用了,不符合“首次出现”的原则,而“计算机软件”这个字符串则是首次出现的,因此返回true。

 

 

4.元空间(方法区)内存溢出

4.1参数设置

-XX:MetaspaceSize=18M -XX:MaxMetaspaceSize=18M   元空间大小18M 最大18M

 

4.2代码

public static void t4(){
        while (true){ //不断的创建动态类
            Enhancer enhancer=new Enhancer();
            enhancer.setSuperclass(LjCollection.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,objects);
                }
            });
            enhancer.create();
        }

 

4.3执行

Metaspace:元空间
Exception in thread "main" java.lang.OutOfMemoryError: Metaspace
    at org.springframework.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:538)
    at org.springframework.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:363)
    at org.springframework.cglib.proxy.Enhancer.generate(Enhancer.java:585)
    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:572)
    at org.springframework.cglib.proxy.Enhancer.create(Enhancer.java:387)
    at com.ruoyi.room.manager.web.controller.Test.t4(Test.java:53)
    at com.ruoyi.room.manager.web.controller.Test.main(Test.java:14)
Disconnected from the target VM, address: '127.0.0.1:9746', transport: 'socket'

Process finished with exit code 1

 

参考https://blog.csdn.net/shenchaohao12321/article/details/96163164