区块链技术博客
www.b2bchain.cn

JVM必知必会 – 虚拟机栈概述

这篇文章主要介绍了JVM必知必会 – 虚拟机栈概述的讲解,通过具体代码实例进行21039 讲解,并且分析了JVM必知必会 – 虚拟机栈概述的详细步骤与相关技巧,需要的朋友可以参考下https://www.b2bchain.cn/?p=21039

本文实例讲述了2、树莓派设置连接WiFi,开启VNC等等的讲解。分享给大家供大家参考文章查询地址https://www.b2bchain.cn/7039.html。具体如下:

目录

前言

什么是JVM虚拟机栈

作用

栈中可能出现的异常

如何设置栈大小

栈运行原理

栈帧的内部结构


前言

本篇文章主要会讲解JVM虚拟机栈的基本信息,背景,作用以及它的一些特性,而栈中具体的内存结构在后面会针对性讲解

 


什么是JVM虚拟机栈

 

Java虚拟机栈,早期也叫Java栈.每个线程在创建的时候都会创建一个虚拟机栈,其内部保存一个个的栈帧,对应一次次的Java方法调用,它是线程独有的.

由于Java语言是跨平台的语言,Java的指令都是根据栈来设计的.不同平台CPU架构不同,所以不能设计为基于寄存器的,而基于栈结构则能更好的对多平台进行兼容

优点

  • 跨平台
  • 指令集小
  • 编译器容易实现

缺点

  • 性能下降
  • 实现同样的功能需要更多的指令

 

作用

主管Java程序运行,它保存的局部变量,部分结果,并参与方法的调用和返回,生命周期和线程一致,线程创建则虚拟机栈创建,线程销毁则虚拟机栈销毁

 

栈中可能出现的异常

如果采用固定大小的Java虚拟机栈,那每一个线程的Java虚拟机栈容量可以在线程创建的时候独立选定,如果线程请求分配栈容量超过Java虚拟机栈允许的最大容量,则抛出StackOverFlowError

如果Java虚拟机栈可以动态扩展,并且尝试扩展的时候无法申请到足够的内存,或者再创建新的线程时候没有足够的内存去创建对应的虚拟机栈,那么Java虚拟机栈抛出一个OutOfMemoryError

 

如何设置栈大小

虚拟机栈的大小是可以设置的,如果不进行设置默认linux是1024kb,可以参考oracle文档  https://docs.oracle.com/en/java/javase/11/tools/java.html#GUID-3B1CE181-CD30-4178-9602-230B800D4FAE

JVM必知必会 - 虚拟机栈概述

 

我们可以对栈的大小进行测试,先使用默认的栈大小,编写一个循环调用的main方法,并且每个main方法都设置一个变量++,看看最终得到的数字

public class StackTest {      private static int i = 1;      public static void main(String[] args) {         i++;         System.out.println(i);         main(args);     }  }

最后我们得到的结果如下

JVM必知必会 - 虚拟机栈概述

 

接下来我们再通过-Xss参数去设置一下栈的大小为100kb

JVM必知必会 - 虚拟机栈概述

然后我们再次运行得到如下结果,很明显栈的深度降低了许多.

JVM必知必会 - 虚拟机栈概述

 

栈运行原理

JVM直接对Java栈的操作只有两个,就是怼栈帧的压栈和出栈,遵循先进后出,后进先出的原则

在一条活动线程中,一个时间点,只会有一个活动的栈帧,即只有当前正在执行的方法的栈帧是有效的,这个栈帧被称为当前栈帧,与当前栈帧相对应的方法就是当前方法,定义这个方法的类就是当前类
执行引擎运行的所有字节码指令只针对当前栈帧进行操作

如果在该方法中调用了其他方法,对应的新的栈帧就会被创建出来,放在栈的顶端,成为新的当前帧

不同线程中锁包含的栈帧是不允许相互引用的

如果当前方法调用了其他方法,方法返回之际,当前栈帧会传回此方法的执行结果,给前一个栈帧,接着虚拟机会丢弃当前栈帧,使得前一个栈帧重新成为当前栈帧

JVM必知必会 - 虚拟机栈概述

 

栈帧的内部结构

  • 局部变量表
  • 操作数栈
  • 动态链接: 指向运行时常量池的方法引用
  • 方法返回地址
  • 一些附加信息

本文转自互联网,侵权联系删除JVM必知必会 – 虚拟机栈概述

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » JVM必知必会 – 虚拟机栈概述
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们