JVM系列(七):虚拟机栈的相关知识介绍

        今天继续给大家分享JVM系列的相关知识,今天介绍一下虚拟机栈的介绍。

1、虚拟机栈的概念

虚拟机栈也称为Java栈,Java每个main方法被执行的时候,JVM都会同步创建一个栈帧(Stack Frame),通过存储局部变量表、操作数栈、动态链接、方法出口等信息来支撑和完成方法的执行。栈帧就是虚拟机栈中的子单位。栈其实只有入栈和出栈两种操作。

栈的操作

入栈:每一次方法调用都会有一个对应的栈帧被压入栈中,也成为压栈。

出栈:方法调用结束后,弹出,也成为弹栈。

2、虚拟机栈的特点

  • 先进后出的原则

  • 线程私有的,它的生命周期和线程保持一致,随线程而生,随线程而灭。

  • 线程请求的栈深度大于虚拟机所允许的最大深度,会抛出StackOverflowError栈溢出异常

  • 虚拟机栈可以动态扩展,如果扩展的时候无法申请得到到足够的内存,就会抛出OutOfMemoryError异常

运行时常见的异常

  • NullPointerException - 空指针引用异常

  • ClassCastException - 类型强制转换异常

  • IllegalArgumentException - 传递不合法参数异常

  • ArithmeticException - 算术计算异常

  • IndexOutOfBoundsException - 下标越界异常

  • NumberFormatException - 数字格式异常

  • UnsupportedOperationException - 不支持的操作异常

3、栈帧

Java中每一个方法从调用开始到执行完成的过程,其实都对应着一个栈帧在虚拟机线程里面从入栈到出栈的过程。

4、栈帧的组成

栈帧由局部变量表、操作数栈(Operand Stack)、动态链接(Dynamic Linking)、方法返回地址(Return Address)和一些附加信息(对程序调试提供支持的信息)组成。

       

        说明:

  • 在活动线程中,只有位于栈顶的栈帧叫做当前栈帧,也是正在执行的方法

  • Java执行引擎运行的所有字节码指令其实都只针对当前栈帧进行操作

4.1 局部变量表 

主要存放了编译期明确的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference 类型,它不是针对对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置)。

4.2 操作数栈 

操作数主要作为方法调用的中转站使用,主要用来存放Java方法执行过程中产生的中间计算结果和计算过程中产生的临时变量。

4.3 动态链接

动态链接主要支撑一个Java方法需要调用其他方法的场景。当 Java 源文件被编译成字节码文件时,所有的变量和方法引用都作为符号引用(Symbilic Reference)保存在Class 文件的常量池里面。当一个Java方法要调用其他Java方法,需要将常量池中指向方法的符号引用转换为其在内存地址中的直接引用。

动态链接作用:其实就是将符号引用转换为调用方法的直接引用。

4.4 方法返回地址

Java方法开始执行后,退出这个方法的方式:正常退出、异常退出

  • 正常退出:执行引擎遇到方法返回的字节码指令,这时候可能会有返回值传递给上层的方法调用者。 正常退出时调用PC计数器的值可以作为返回地址。

  • 异常退出:在方法执行过程中遇到异常,且异常没有在方法体内得到处理,返回地址要交给异常处理表来决定如何处理。

说明:方法退出之后,都需要返回到方法被调用的原始位置,程序才能继续执行

5、栈的优缺点

优点:

栈帧内数据共享:一个栈帧中内存数据共享,不同栈帧之间数据不共享,这样可以减少内存消耗

存储速度:栈帧存取数据快,仅次于寄存器,

  • 编译的时候就分配好了内存,运行过程中不需要申请内存大小,节约时间成本。

  • 栈是机器提供的数据结构,计算机会分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,效率高

  • 相比较堆来说,访问效率高

缺点

灵活性差:栈在运行过程中,不能动态的去申请内存、程序可能会报错。

6、内存中栈和堆的对比

栈属于运行时的单位主要解决程序如何执行的问题,堆属于存储的单位主要是用来解决数据的存储问题。

  • 堆是运行时数据区较大的一块,所以Java的对象基本都放在堆空间。

  • 栈主要用来存放基本数据类型的局部变量、引用数据类型的对象的引用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/270027.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM系列(八):堆(Heap)的相关知识介绍

目录 1、JVM堆的概念 2、JVM堆的特点 3、JVM堆的内部结构 3.1 组成 3.2 堆内存内部空间所占比例 3.3 永久代和元空间区别 4、堆空间的大小设置 5、堆空间垃圾回收 1、JVM堆的概念 JVM中的堆是用来存放对象的内存空间,几乎所有的Java对象、数组都存储在JVM的…

电脑技巧:Hyper-V安装UOS操作系统图文教程

今天给大家分享微软官方Hyper-v虚拟机管理软件安装UOS操作系统图文教程,感兴趣的朋友也可以下载试一试,当然有啥问题也可以互相沟通交流! 1、首先任务管理切换到性能选项卡,查看虚拟化是否已经启用,如果没有启用的话&…

JVM系列(九):MinorGC、MajorGC、FullGC垃圾回收介绍

今天给大家继续分享MinorGC、MajorGC、FullGC相关知识,如有不对的地方欢迎指正! 1、MinorGC (新生代垃圾回收) JDK1.8 堆内部结构 从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC&…

JVM系列(十):JVM垃圾回收算法相关知识

今天给大家继续分享JVM垃圾回收算法相关知识,如有不对的地方欢迎指正。 JVM垃圾回收算法主要有标记清除、复制算法、标记整理、分代收集四种,下面来逐一介绍。 1、标记清除(Mark-Sweep) 标记清除作为最基础的垃圾回收算法&#…

Java8 拼接字符串 StringJoiner

StringJoiner是Java8新出的一个类,用于构造由分隔符分隔的字符序列,并可选择性地从提供的前缀开始和以提供的后缀结尾。省的我们开发人员再次通过StringBuffer或者StingBuilder拼接。 我们查看一下一下代码,试着猜一下。 1.简单的字符串拼接…

分享Git常见的项目托管平台

今天给大家分享Git常见的项目托管平台,大家一起来看看吧! 1、GitHub GitHub是一个面向开源及私有软件项目的托管平台,因为只支持Git作为唯一的版本库格式进行托管,故名GitHub。是全球最大、代码质量最高的Git开源项目平台。遗憾的…

网络技巧:教你给路由器装上电池,断电照样可以上网

家里要是停电了,你的WiFi还能上网吗?想都不用想,“肯定不能”估计所有人都会这样回答。如果小编跟你说即使停电了,也有个小方法让你能够用WiFi,你会相信不?下面大家一起来看看吧! 其实&#xff…

电脑软件:推荐一款磁盘空间分析工具——WizTree

目录 1、WizTree是啥? 2、WizTree的特点 2.1 磁盘空间利用率分析 2.2 扫描速度快 2.3 支持多文件系统格式 2.4 树状图显示 2.5 大文件快速查找 2.5 支持文件名模糊搜索 2.6 支持导出文件和 MFT 数据 2.7 支持导入文件和 MFT 数据 2.8 命令行支持 3、总结…

分布式自增ID算法---雪花算法(SnowFlake)Java实现

分布式id生成算法的有很多种,Twitter的SnowFlake就是其中经典的一种。 算法原理 SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下图: 1bit,不用,因为二进制中最高位是符号位,1表示负数&…

软件:给大家推荐一款国产非常好用的效率软件uTools

目录 1、uTools介绍 2、安装下载 3、uTools常用功能介绍 今天给大家推荐一款办公人员必备的效率软件uTools,可以大幅度提升你的生产力,感兴趣的朋友可以下载试一试,相信你一定会爱不释手。 1、uTools介绍 uTools是一款插件化,极简、跨平…

数据库知识:SQLServer创建非sa用户笔记

数据库安全是数据库运维非常重要的环节,今天给大家分享SQLServer如何创建非sa用户,并且设置数据库对应的访问权限,希望对大家能有所帮助! 1、创建登录名 1.1、创建登录名 安全性→登录名→新建登录名(鼠标右键&#xf…

微软电脑管家2.0公测版体验

前言 微软电脑管家2.0公测版本终于发布了,之前给大家分享过微软电脑管家测试版的文章,今天给大家再介绍一下微软电脑管家2.0公测版究竟带来了哪些更新,大家一起来看看吧! 安装要求 微软官方公布的安装要求是windows10的1809版本…

布隆过滤器(Bloom Filter)的原理和实现

布隆过滤器使用场景 之前在《数学之美》里面看到过布隆过滤器的介绍。那么什么场景下面需要使用布隆过滤器呢? 看下下面几个问题 字处理软件中,需要检查一个英语单词是否拼写正确在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上在网络爬虫里&a…

硬件知识:RTMP和RTSP传统流媒体协议介绍

今天给大家分享RTMP和RTSP传统流媒体协议介绍,希望对大家能有所帮助! 1、RTSP 1.1 RTSP协议介绍 RTSP (Real-Time Stream Protocol)由Real Networks 和 Netscape共同提出的,基于文本的多媒体播放控制协议。RTSP定义…

电脑知识:台式电脑应该选择品牌和组装,值得收藏

互联网时代的发展,电脑对大家日常办公、游戏、影音娱乐都是常用的设备。今天主要给大家分享一下购买台式电脑应该注重品牌还是组装,相信看完本文对你选购台式电脑提供更多的参考。 1、品牌电脑 品牌电脑就是由大品牌电脑厂商(联想、IBM、戴…

Docker基础:Docker是什么,为什么这么火

一、Docker是什么? Docker是一个开源的应用容器引擎,它基于go语言开发,并遵从Apache2.0开源协议。使用Docker可以让开发者封装他们的应用以及依赖包到一个可移植的容器中,然后发布到任意的 Linux 机器上运行。Docker 的核心思想打…