zoukankan      html  css  js  c++  java
  • 堆中堆溢出,栈溢出实例,永久区溢出

    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)
    

      

  • 相关阅读:
    Vue源码解析-源码目录及源码调试运行
    Vue.js源码解析-从scripts脚本看vue构建
    ps 命令显示不完整的问题
    Linux中10个实用命令,千万不要错过
    Linux 下如何使用 fc 和 alias 命令
    Mac 查看正在后台运行(显示)的程序
    Mac 显示桌面
    Mac如何批量关闭同一个程序
    Mac 选中删除
    Mac 中 vscode 打开项目文件夹
  • 原文地址:https://www.cnblogs.com/wonder2636/p/5525332.html
Copyright © 2011-2022 走看看