JVM存在的两种内存报错StackOverflowError和OutOfMemoryError

JVM内存异常

内存异常有两种:内存溢出和内存泄漏,JVM内存异常也存在这两种内存异常的情况。

  • 内存溢出:分配内存时,发现内存不够用
  • 内存泄漏:回收内存时,已经不被占用的内存无法被正常回收,造成闲置但无法被重新分配的情况

JVM内存指JVM的运行时数据区,包括程序计数器、堆、虚拟机栈、本地方法栈以及方法区。其中,程序计数器不会发生内存异常的情况。
JVM内存异常时,有两种错误提示类型,包括栈溢出(StackOverflowError)和内存溢出(OutOfMemoryError)。

JVM不区分虚拟机栈和本地方法栈的内存异常情况,一视同仁为栈

一、StackOverflowError
1、发生的区域

  • 虚拟机栈
  • 本地方法栈

2、发生的场景

  • 对于固定栈深大小的栈,在其分配内存时,无法获取足够内存时,会报StackOverflowError
  • 对于可扩展的栈,在首次分配内存时,无法获取足够内存时,会报StackOverflowError

二、OutOfMemoryError
1、发生的区域

  • 虚拟机栈
  • 本地方法栈
  • 方法区

2、发生的场景

  • 栈:对于非固定大小的栈,在其扩展时(扩容),如果没有办法获取到足够大小的内存,报OutOfMemoryError
  • 堆:触发过垃圾回收后,仍然分配不到足够的内存空间,会报OutOfMemoryError
    • 创建对象时
    • 创建数组时
  • 方法区:触发过垃圾回收后,仍然分配不到足够的内存空间,会报OutOfMemoryError
    • 加载类时
    • 创建常量时

内存中的各部分关系
1)内存=JVM内存+其余内存空间(其中包括JVM可操控的直接内存)
在整个内存中,当JVM内存越大,直接内存越容易OOM

2)JVM内存=栈+堆+方法区+程序计数器
在JVM内存中,当堆内存越大,栈就越容易OOM

3)方法区=运行时常量区+类型存放区+即时编译产物存放区
在方法区,类型存放区越大,运行时常量区越容易OOM

4)在栈中,栈帧越大,栈越容易溢出

你可能感兴趣的:(JVM,java)