· StackOverflowErrorOutOfMemoryError是JVM中常见的有关内存的异常,需结合JVM来;
· 在理解、区分这两个异常前,需要知道JVM中运行时数据区的结构;【见图1的讲解】
· 在了解JVM中运行时数据区的结构后,才能对以上两个异常从内存与线程层面有个好的认识;【见图2的讲解】

一、前置知识:JVM运行时数据区


    见图1,JVM运行时,数据区主要有5大类信息:方法区(JDK 8之后叫做元空间)、JVM栈、本地方法栈、堆、PC寄存器。

· 方法区(元空间)
    在Java虚拟机中,元空间(方法区)是可提供各个线程共享的运行时内存区域,它存储了每一个类的结构信息,例如运行时常量池,字段和方法数据,构造函数和普通函数的字节码内容。它利用的是本地内存,不是JVM内存

· JVM栈
    虚拟机栈也是每条线程私有的区域,里头存储栈帧(Frame),后面会重点介绍栈帧算是重点内容。方法的调用与返回基于栈帧来实现的。

· 本地方法栈
    在Java中调用别的语言代码(例如C/C++)的话就需要用到别的方法栈。JVM会用到传统的栈(C stack)来调用native方法,这个就是本地方法栈的应用,当然这个不是必须实现的,完全取决于虚拟机的实现。

·
    在Java虚拟机中堆是所有线程都可以共享的内存区域,是存放所有类实例和数组对象的地方。在虚拟机启动就根据相关堆参数,创建堆,他也是GC工作的主要区域。
    堆分为年轻代和老年代。

· PC寄存器
    全名叫做 Program Counter Register,概念类比于计算机组成原理中的PC寄存器,存放下一条指令的地址,线程私有,方便线程切换(比如并发),用于保存现场。


二、StackOverflowError与OutOfMemoryError的结构

见图2,在JVM运行时数据区中:
    · 方法区(JDK 8之后叫做元空间)、堆:是线程共享的,所有线程共用元空间和堆。堆用的是JVM内存,元空间使用本地内存,GC会对这两个部分进行收集。当堆或元空间满溢时,报错:OOM(OutOfMemoryError)

· JVM栈、本地方法栈、、PC寄存器:是线程私有的,每个线程都有属于自己的JVM栈、本地方法栈、PC寄存器。对于栈结构来说,只存在入栈、出栈操作,效率比使用内存结构高,GC不会对栈结构进行收集。(所以我们优化代码时可以利用逃逸分析原理来使得数据存储在JVM栈中。)一旦栈过大,超出范围,就会报错:StackOverflowError
    对于PC寄存器来说,它只存一个地址,不存在溢出,也不会被GC收集。

【JVM】StackOverflowError与OutOfMemoryError相关推荐

  1. StackOverflowError与OutOfMemoryError区别

    在Java虚拟机规范中,定义了这么两种异常:StackOverflowError与OutOfMemoryError. 那么它们到底直接有啥区别呢? 在<The Java ® Virtual Ma ...

  2. 【jvm】java jvm 报错 OutOfMemoryError: GC overhead limit exceeded

    1.概述 JVM 抛出 OutOfMemoryError 的最后一种情况是 JVM 认为在执行 GC 上花费了太多时间: Exception in thread "main" ja ...

  3. 【深入Java虚拟机JVM 04】JVM内存溢出OutOfMemoryError异常实例

    说明:文章所有内容均摘自<深入理解Java虚拟机:JVM高级特性与最佳实践(第二版)> 在Java虚拟机规范的描述中,除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMe ...

  4. 2022-03-30 StackOverflowError与OutOfMemoryError详解

    如果当前线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常. 如果虚拟机在扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常. 一 S ...

  5. java stackoverflowerror与outofmemoryerror区别

    1.stackoverflow: 每当java程序启动一个新的线程时,java虚拟机会为他分配一个栈,java栈以帧为单位保持线程运行状态:当线程调用一个方法是,jvm压入一个新的栈帧到这个线程的栈中 ...

  6. StackOverflowError 和 OutOfMemoryError

    StackOverflowError Java线程操作是基于栈的,当调用方法内部方法也就是进行一次递归的时候就会把当前方法压入栈直到方法内部的方法执行完全之后,就会返回上一个方法,也就是出栈操作执行上 ...

  7. JVM StackOverFlowError

    文章目录 问题信息 出现问题的环境 问题描述 错误信息 排查过程 初次排查 再起波澜 问题原因 解决方案 修改JVM大小 SQL优化 问题信息 出现问题的环境 Linux + Tomcat + jdk ...

  8. Java内存溢出及解决:OutOfMemoryError 和 StackOverflowError

    一.OutOfMemoryError 和 StackOverflowError 1️⃣堆区域用来存放 Class 的实例(即对象),对象需要存储的内容主要是非静态属性.每次用 new 创建一个对象实例 ...

  9. JVM内存溢出的几种情形

    1.堆溢出 原因:大量对象占据了堆空间,而这些对象都有强引用导致无法回收,当对象大小之和>Xmx参数指定的堆大小时导致溢出! List<byte[]> list = new Arra ...

最新文章

  1. 云南大学信息学院c语言实验七,云南大学软件学院C语言程序
  2. java.net.SocketException四大异常解决方案
  3. android布局中显示隐藏动画
  4. 适用于单片机的数据加密算法:xxtea
  5. dos批处理命令详解(转)
  6. 力扣回文字串的动态规划解法
  7. visual studio配置opencv
  8. 以太网设计FAQ:以太网MAC和PHY
  9. 计算机网络图标显示不出来,网络图标不见了汇总解决教程
  10. 肠道微生物组在人类神经系统疾病中的作用
  11. 如何用笔记本组建家庭点歌系统
  12. python中文词云图代码_用python写一个词云图生成器
  13. cosx sinx 泰勒展开 C++
  14. win10网络重置后,网卡驱动消失且装不上驱动的以及驱动带感叹号的解决办法
  15. MySql now函数
  16. Unraid 6.8.2-nvidia解锁nvenc线程限制
  17. mysql代码导出excel_数据库导出excel代码
  18. 非oracle用户连接数据库出现ORA-12514
  19. 因果推断-重要概念:ATE/CATE/ITE/ATT
  20. java[逾期检测]开发图书租借系统

热门文章

  1. 创建一个栈存储结构,并且写入一些对栈的基本的操作
  2. Welsh色彩迁移算法
  3. Science | 初步的SARS-CoV-2蛋白酶抑制剂在小鼠中显示功效
  4. Windows10下Python3做OpenGL的编程
  5. Locality Sensitive Hashing(局部敏感哈希)
  6. Shiny平台构建与R包开发(七)——Shiny APP部署
  7. 图形显卡_显卡缺货?专业图形卡主机方案演示,Quadro P2200
  8. 正定小主人机器人_石家庄正定县2015中小学生机器人运动大赛隆重开幕
  9. pwd python 安装 模块_Python自动化办公之邮件定时发送
  10. 第一轮通知 | 2022年中国生物物理学会肠道菌群分会年会暨“崂山论肠菌”学术论坛...