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,一经查实,立即删除!

相关文章

Fragment管理工具类

Fragment相关→FragmentUtils.java→Demo addFragment : 新增fragment removeFragment : 移除fragment replaceFragment : 替换fragment popFragment : 出栈fragment popToFragment : 出栈到指定fragment popAddFragm…

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、首先任务管理切换到性能选项卡,查看虚拟化是否已经启用,如果没有启用的话&…

ANDROID内存优化(大汇总——中)

写在最前: 本文的思路主要借鉴了2014年AnDevCon开发者大会的一个演讲PPT,加上把网上搜集的各种内存零散知识点进行汇总、挑选、简化后整理而成。 所以我将本文定义为一个工具类的文章,如果你在Android开发中遇到关于内存问题,或者…

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.简单的字符串拼接…

函数⑥作用域与命名空间

尽管 JavaScript 支持一对花括号创建的代码段&#xff0c;但是并不支持块级作用域&#xff1b; 而仅仅支持 函数作用域。 function test() { // 一个作用域for(var i 0; i < 10; i) { // 不是一个作用域// count}console.log(i); // 10 }注意: 如果不是在赋值语句中&#x…

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

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

【转】Java MySQL数据类型对照

Java MySQL数据类型对照 类型名称显示长度数据库类型JAVA类型JDBC类型索引(int)描述 VARCHARLNVARCHARjava.lang.String12 CHARNCHARjava.lang.String1 BLOBLNBLOBjava.lang.byte[]-4 TEXT65535VARCHARjava.lang.String-1 INTEGER4INTEGER UNSIGNEDjava.lang.Long4 …

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

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

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

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

dockerfile nginx配置

Dockerfile 代码 From hub.c.163.com/public/nginx:1.2.1 RUN rm -v /etc/nginx/nginx.confADD nginx.conf /etc/nginx/RUN echo "daemon off;" >> /etc/nginx/nginx.conf RUN chown -R www-data:www-data /var/lib/nginxRUN mkdir -p /usr/src/node-app RUN m…

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

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

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

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

iOS Coding项目片段记录(八)

继续一些小知识点&#xff0c;想起来就贴出来。 监测网络状态1.主动监测监测网络状态是否WIFI (BOOL)isEnableWIFI {return ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] ! NotReachable);}是否3G (BOOL)isEnable3G {return ([[Reachability reachab…