• 堆中堆溢出,栈溢出实例,永久区溢出


    1.堆溢出

    main:
    public class HeapOOM {
       
      public static void main(String[] args) {
        List<UserBean> users = new ArrayList<UserBean>();
        while (true) {
          users.add(new UserBean());
        }
      }
    
    bean:
    public class UserBean {
      String name;
      int age;
    }
    然后在运行的时候设置jvm参数
    -xmx1m -Xms1m -Xmn1m
    
    运行结果:
    
    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
      at java.util.Arrays.copyOf(Unknown Source)
      at java.util.Arrays.copyOf(Unknown Source)
      at java.util.ArrayList.grow(Unknown Source)
      at java.util.ArrayList.ensureExplicitCapacity(Unknown Source)
      at java.util.ArrayList.ensureCapacityInternal(Unknown Source)
      at java.util.ArrayList.add(Unknown Source)
      at oom.HeapOOM.main(HeapOOM.java:21)
    

    2.栈溢出

    main:
    
    public static void main(String[] args) {
        Recursion recursion = new Recursion();
        try {
          recursion.recursionself();
        } catch (Throwable e) {
          System.out.println("current value :" + recursion.currentValue);
          throw e;
        }
      }
    
    bean:
    public class Recursion {
        public int currentValue = 0;
    
        public void recursionself() {
            currentValue += 1;
            recursionself();
        }
    }
    
    设置参数 -Xss100k
    结果:
    Exception in thread "main" java.lang.StackOverflowError
      at testbean.Recursion.recursionself(Recursion.java:7)
      at testbean.Recursion.recursionself(Recursion.java:8)
      at testbean.Recursion.recursionself(Recursion.java:8)
      at testbean.Recursion.recursionself(Recursion.java:8)
      at testbean.Recursion.recursionself(Recursion.java:8)
      at testbean.Recursion.recursionself(Recursion.java:8)
    

     3.永久区溢出:

    第三个异常是关于perm的异常内容,我们需要的是设置方法区的大小,实现方式是通过设置-XX:PermSize和-XX:MaxPermSize参数
    如果程序加载的类过多,例如tomcatweb容器,就会出现PermGen space异常,如果我将HeapOOM类的运行时的XX:PermSize设置为1M
    那么程序就不会执行成功,执行的时候出现如下异常:
    Error occurred during initialization of VM
    java.lang.OutOfMemoryError: PermGen space
      at sun.misc.Launcher$ExtClassLoader.getExtClassLoader(Unknown Source)
      at sun.misc.Launcher.<init>(Unknown Source)
      at sun.misc.Launcher.<clinit>(Unknown Source)
      at java.lang.ClassLoader.initSystemClassLoader(Unknown Source)
      at java.lang.ClassLoader.getSystemClassLoader(Unknown Source)
    

      

  • 相关阅读:
    javascript正则表达式对象、窗体对象11.0
    springboot~不用模板执行html文件
    springboot-jar-web
    springboot-war
    springboot-jar
    idea~创建maven webapp项目
    简单日志项目
    loback.xml 在idea中代码自动完成
    mysql 时区问题导致的时间相差14小时
    mariadb vs mysql
  • 原文地址:https://www.cnblogs.com/wonder2636/p/5525332.html
Copyright © 2020-2023  润新知