Java虚拟机栈

Java虚拟机栈它也是线程私有的一块内存区域,所以生命周期自然和线程相同。

每个方法在执行的时候,Java虚拟机栈都会同步生成一个栈帧,然后再将这个栈帧压入Java虚拟机栈中,所以Java虚拟机栈主要保存的就是这个栈帧。

栈是一种先进后出的数据结构,所以Java虚拟机栈他只会先处理位于栈顶的栈帧,而位于栈底的栈帧(也就是最先入栈的栈帧)只会等待其上面的栈帧处理完毕了才会被处理。

当一个方法从调用到执行完毕,就意味着一个栈帧从Java虚拟机栈中从入栈到出栈的过程。

栈帧

栈帧主要保存局部变量表、操作数栈、动态连接、方法出口这几类数据。

局部变量表

局部变量表的大小

在编译程序代码的时候,就可以确定栈帧中需要多大的局部变量表了,具体大小可以在编译后的Class文件中看到了

即,局部变量表的大小,是在编译的时候就确定了。

局部变量表的容量

局部变量表的容量是以**槽(Slot)**为单位的,每个槽可以存储多大的空间是有虚拟机实现的(比如:32位长度、64位长度等等)

一般都是用32位长度的内存空间来实现,那么64位的long和double是占2个槽的,其余的不足32位长度的数据类型则占一个槽(包括引用类型和返回地址(returnAddress)都只占一个槽)

PS:或许这就是设置32位长度为一个槽的原因吧,为了节省空间,当然,纯属个人猜测

在方法执行的时候,虚拟机是用局部变量表完成参数值到参数变量列表的传递过程的,如果执行的是实例方法,局部变量表第0位索引的槽默认是用于传递方法所属对象实例的引用(在方法中可以用this关键字来访问这个隐含的函数)

这些可能有些难以理解

实例方法其实就是普通方法,而类方法是带static修饰的静态方法,静态方法是在初始化类的时候直接创建的,调用的时候直接用类名.(点)方法就可以了,而实例方法得先new出对象了才能通过对象调用。

在一个方法中,你可以直接用this来调用该对象的其他变量或方法,因为该对象就是保存在局部变量表中的第0位索引的位置上,可以直接通过this访问该对象。

看完这两段之后再看上面的可能就会好理解多了

操作数栈

  • 和局部变量表一样,操作数栈的大小,同样是在编译的时候就确定了大小
  • 当栈帧被创建的时候,操作数栈是空栈,操作数栈的每个项都可以存放JVM中的数据类型,其中double和long占2个栈深
  • 方法执行的过程中,会有各种字节码指令往操作数栈中写入和提取内容,也就是入栈和出栈操作
  • 操作数栈调用其他返回结果的方法时,会把结果push到栈上(通过操作数栈来进行参数传递)

动态连接

  • 每个栈帧都包含一个指向运行时常量池中该所属方法的引用,持有这个引用是为了支持方法调用过程中的动态连接
  • 在类加载阶段中的解析阶段会将符号引用转为直接引用,这种转发也称为静态解析。另外的一部分将在运行时转化为直接引用,这部分称为动态连接

返回地址(returnAddress)

当方法开始执行后,只有两种方式可以退出:方法返回指令异常终止

本地方法栈

本地方法栈和java虚拟机栈所发挥的作用是非常相似的,其区别就是

  • java虚拟机栈为虚拟机执行Java方法(也就是字节码)服务
  • 本地方法栈则是为虚拟机使用到的本地方法服务

StackOverflowError和OutOfMemoryError异常

Java虚拟机栈

  • 如果线程请求的栈深度大于虚拟机所允许的深度,则会抛出StackOverflowError异常
  • 如果Java虚拟机栈容量可以动态扩展,当栈扩展时无法申请到足够的内存会抛出OutOfMemoryError异常

本地方法栈
与虚拟机栈一样,本地方法栈也会在栈深度溢出或者栈扩展失败时分别抛出StackOverflowError和OutOfMemoryError异常

Java虚拟机栈和本地方法栈相关推荐

  1. 46栈内存溢出、内存区域(程序计数器、Java 虚拟机栈、本地方法栈、Java 堆、方法区、直接内存、内存溢出)与内存溢出(对象实例化分析)

    46.什么情况下会发生栈内存溢出 46.1.Java 内存区域与内存溢出 46.1.1.内存区域 46.1.1.1.程序计数器 46.1.1.2.Java 虚拟机栈 46.1.1.3.本地方法栈 46 ...

  2. java 本地方法栈_Java虚拟机栈和本地方法栈

    Java虚拟机栈的特征 线程私有 后进先出(LIFO)栈 存储栈帧,支持Java方法的调用.执行和退出 可能出现OutOfMemoryError异常和StackOverflowError异常 Java ...

  3. 从几个sample来学习Java堆,方法区,Java栈和本地方法栈

    2019独角兽企业重金招聘Python工程师标准>>> 最近在看<深入理解Java虚拟机>,书中给了几个例子,比较好的说明了几种OOM(OutOfMemory)产生的过程 ...

  4. 11.JDK8内存模型、本地方法栈、虚拟机栈、栈帧结构(局部变量表、操作数栈、方法出口、虚拟机栈与本地方法栈的关系、寄存器、方法区、堆(Heap)、jvm中的常量池、Metaspace(元空间))

    11.JDK8内存模型 11.1.本地方法栈(Native Method Stacks) 11.2.虚拟机栈(Java Virtual Machine Stacks) 11.3.栈帧结构 11.3.1 ...

  5. 12.JDK1.8 JVM运行时数据区域概览、各区域介绍、程序计数器、Java虚拟机栈、本地方法栈、堆、堆空间内存分配(默认情况下)、字符串常量池、元数据区、jvm参数配置

    12.JDK1.8 JVM运行时数据区域概览 12.1.JDK1.8 JVM运行时数据区域概览 12.2.各区域介绍 12.3.各区域介绍 12.3.1.程序计数器 12.3.2.Java虚拟机栈 1 ...

  6. 【JVM】运行时数据区概述(程序计数器、虚拟机栈、本地方法栈)

    前言 本节主要讲的是运行时数据区,也就是下图这部分,它是在类加载完成后的阶段 当我们通过前面的:类的加载-> 验证 -> 准备 -> 解析 -> 初始化 这几个阶段完成后,就会 ...

  7. Java堆溢出,虚拟机栈和本地方法栈溢出

    Java堆溢出 JVM运行时分区的堆区是占比最大的,它用来存储对象的,每当我们new一个对象,而且要保证这个对象到GC Roots 那些对象是有路径可达的(不可达就有很大可能性被清除),那么当对象的数 ...

  8. java 本地方法栈_JVM学习笔记-本地方法栈(Native Method Stacks)

    本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native ...

  9. JVM内存结构|本地方法栈和堆

    本地方法栈 服务的对象是jvm执行的native方法,而虚拟机栈服务的对象 当线程调用本地方法时,虚拟机会保持java栈不变,不再在线程的java栈中压入新的栈帧,虚拟机只是简单的动态连接并直接调用指 ...

  10. 本地方法栈线程公有_Java运行时区域,哪些区域是线程私有的?哪些是共有的?...

    JVM 运行时数据区域大致可以分为:程序计数器.虚拟机栈.本地方法栈.堆区.元空间.运行时常量池.直接内存等区域:就是下面这个样子的: 其中有些区域,随着 JDK 版本的升级不断调整,例如: JDK ...

最新文章

  1. 将字符型的数字转化为整型
  2. oracle修改时区无效,Oracle 时区问题
  3. mysql远程主机强迫关闭了一个现有连接_asp.net连接mysql出现了远程主机强迫关闭了一个现有的连接。!!!...
  4. 多项式拟合缺点_机器学习——机器学习算法优缺点综述
  5. java创建具体时间点_java单例饿汉模式对象创建时间点疑问
  6. ASP.NET2.0数据库入门之SQL Server
  7. mysql实际项目中使用多长时间_存储过程在实际项目中用的多吗?
  8. rabbitmq-死信队列
  9. Apache Cassandra 1.1.0 稳定版发布
  10. Java多线程多个线程之间共享数据
  11. 关于微信隐藏分享按钮的心得
  12. 常用liunx / mysql命令
  13. SaaSBase:最受欢迎的跨境电商软件有哪些(上篇)
  14. CODESYS Visualization
  15. numpy.median
  16. 服务器装虚拟声卡,虚拟声卡,教您怎么安装虚拟声卡
  17. Android 手写签名 (图片合成)
  18. 利用python批量查询企业信息_Python 实现批量查询域名可用性
  19. html5水涟漪动画,CSS3水波涟漪动画定位样式制作教程
  20. 【Arduino基础】一位数码管实验

热门文章

  1. firebug下载时出现there was an error loading firebug
  2. Logistic模型原理详解以及Python项目实现
  3. 华为手机刷机后显示无服务器,华为手机刷机后,无法开机怎么办?
  4. 欢乐时光病毒5月7日将发作
  5. centos 雷凌凌ralink无线网卡驱动 安装
  6. SD nand flash 简单的读写速度测试
  7. 电阻电容电感PCB封装真实尺寸大小
  8. 阅读ArrayList源码的一些记录
  9. Docker|安装docker toolbox ,拉取镜像并在浏览器中打开 2021-05-29
  10. 时间序列平稳性的判断