Java虚拟机栈和本地方法栈
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虚拟机栈和本地方法栈相关推荐
- 46栈内存溢出、内存区域(程序计数器、Java 虚拟机栈、本地方法栈、Java 堆、方法区、直接内存、内存溢出)与内存溢出(对象实例化分析)
46.什么情况下会发生栈内存溢出 46.1.Java 内存区域与内存溢出 46.1.1.内存区域 46.1.1.1.程序计数器 46.1.1.2.Java 虚拟机栈 46.1.1.3.本地方法栈 46 ...
- java 本地方法栈_Java虚拟机栈和本地方法栈
Java虚拟机栈的特征 线程私有 后进先出(LIFO)栈 存储栈帧,支持Java方法的调用.执行和退出 可能出现OutOfMemoryError异常和StackOverflowError异常 Java ...
- 从几个sample来学习Java堆,方法区,Java栈和本地方法栈
2019独角兽企业重金招聘Python工程师标准>>> 最近在看<深入理解Java虚拟机>,书中给了几个例子,比较好的说明了几种OOM(OutOfMemory)产生的过程 ...
- 11.JDK8内存模型、本地方法栈、虚拟机栈、栈帧结构(局部变量表、操作数栈、方法出口、虚拟机栈与本地方法栈的关系、寄存器、方法区、堆(Heap)、jvm中的常量池、Metaspace(元空间))
11.JDK8内存模型 11.1.本地方法栈(Native Method Stacks) 11.2.虚拟机栈(Java Virtual Machine Stacks) 11.3.栈帧结构 11.3.1 ...
- 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 ...
- 【JVM】运行时数据区概述(程序计数器、虚拟机栈、本地方法栈)
前言 本节主要讲的是运行时数据区,也就是下图这部分,它是在类加载完成后的阶段 当我们通过前面的:类的加载-> 验证 -> 准备 -> 解析 -> 初始化 这几个阶段完成后,就会 ...
- Java堆溢出,虚拟机栈和本地方法栈溢出
Java堆溢出 JVM运行时分区的堆区是占比最大的,它用来存储对象的,每当我们new一个对象,而且要保证这个对象到GC Roots 那些对象是有路径可达的(不可达就有很大可能性被清除),那么当对象的数 ...
- java 本地方法栈_JVM学习笔记-本地方法栈(Native Method Stacks)
本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native ...
- JVM内存结构|本地方法栈和堆
本地方法栈 服务的对象是jvm执行的native方法,而虚拟机栈服务的对象 当线程调用本地方法时,虚拟机会保持java栈不变,不再在线程的java栈中压入新的栈帧,虚拟机只是简单的动态连接并直接调用指 ...
- 本地方法栈线程公有_Java运行时区域,哪些区域是线程私有的?哪些是共有的?...
JVM 运行时数据区域大致可以分为:程序计数器.虚拟机栈.本地方法栈.堆区.元空间.运行时常量池.直接内存等区域:就是下面这个样子的: 其中有些区域,随着 JDK 版本的升级不断调整,例如: JDK ...
最新文章
- 将字符型的数字转化为整型
- oracle修改时区无效,Oracle 时区问题
- mysql远程主机强迫关闭了一个现有连接_asp.net连接mysql出现了远程主机强迫关闭了一个现有的连接。!!!...
- 多项式拟合缺点_机器学习——机器学习算法优缺点综述
- java创建具体时间点_java单例饿汉模式对象创建时间点疑问
- ASP.NET2.0数据库入门之SQL Server
- mysql实际项目中使用多长时间_存储过程在实际项目中用的多吗?
- rabbitmq-死信队列
- Apache Cassandra 1.1.0 稳定版发布
- Java多线程多个线程之间共享数据
- 关于微信隐藏分享按钮的心得
- 常用liunx / mysql命令
- SaaSBase:最受欢迎的跨境电商软件有哪些(上篇)
- CODESYS Visualization
- numpy.median
- 服务器装虚拟声卡,虚拟声卡,教您怎么安装虚拟声卡
- Android 手写签名 (图片合成)
- 利用python批量查询企业信息_Python 实现批量查询域名可用性
- html5水涟漪动画,CSS3水波涟漪动画定位样式制作教程
- 【Arduino基础】一位数码管实验