• 技术文章 >java >java基础

    java内存溢出的四种情况

    小妮浅浅小妮浅浅2021-07-23 09:51:40原创4489

    1、堆溢出,堆是存放实例对象的,但是这样堆区迟早会满。设置了堆区内存,创建就会抛出异常。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    public class HeapOOM {

        static class User {}

        public static void main(String[] args) {

             List<User> list = new ArrayList<User>();

                while (true) {

                    list.add(new User());

             }

        }

    }

    /*Exception in thread "main" java.lang.OutOfMemoryError:

    GC overhead limit exceeded

    at com.fdd.test.HeapOOM.main(HeapOOM.java:11)*/

    2、虚拟机栈和本地方法栈溢出

    如果线程要求的堆栈深度大于虚拟机锁允许的深度,则抛出StackOverflowEror异常。

    如果虚拟机在扩展堆栈时无法申请足够的存储空间,则会出现异常。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    public class StackOutOfMemoryError {

        public static void main(String[] args) {    

             test();

        }

        private static void go() {

            System.out.println("StackOverflowError异常");

            test();

        }

    }

    /*Exception in thread "main" java.lang.StackOverflowError

        at sun.nio.cs.ext.DoubleByte$Encoder.encodeLoop(DoubleByte.java:617)

        at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:579)

        at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:271)

        at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:125)

        at java.io.OutputStreamWriter.write(OutputStreamWriter.java:207)

        at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:129)

        at java.io.PrintStream.write(PrintStream.java:526)

        at java.io.PrintStream.print(PrintStream.java:597)

        at java.io.PrintStream.println(PrintStream.java:736)

        at com.fdd.test.StackOutOfMemoryError.go(StackOutOfMemoryError.java:11)

    at com.fdd.test.StackOutOfMemoryError.go(StackOutOfMemoryError.java:13)*/

    3、方法区和运行时常量池溢出

    4、本机直接内存溢出

    DirectMemory容量可通过-XX:MaxDirectMemorySize指定,如不指定,默认与Java堆的值(-Xmx指定)相同。

    以上就是java内存溢出的四种情况,我们对于可能会产生的内存溢出问题进行了分类的归纳,大家想要更深入的了解这部分的问题,可以找一些不同类型的内存溢出实例进行练习。更多Java学习指路:Java基础

    本教程操作环境:windows7系统、java10版,DELL G3电脑。

    专题推荐:java内存溢出
    上一篇:java静态和动态绑定的对比 下一篇:java方法重载的无效探究

    相关文章推荐

    • Java内存交互的规则• java内存结构的组成• java内存模型的组成• Java内存模型的并发处理• Java内存交互如何操作• Java内存屏障是什么• java内存屏障有哪些类型• Java内存分配是什么• java内存泄漏• java内存泄漏的解决方法

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网