首页 > 其他分享 >JVM虚拟机系统性学习-运行时数据区(虚拟机栈、本地方法栈)

JVM虚拟机系统性学习-运行时数据区(虚拟机栈、本地方法栈)

时间:2023-12-15 23:04:19浏览次数:32  
标签:Java 虚拟机 局部变量 系统性 线程 引用 JVM 方法

虚拟机栈

虚拟机栈为每个线程所私有的,如下图:

JVM虚拟机系统性学习-运行时数据区(虚拟机栈、本地方法栈)_Java

栈帧是什么?

栈帧存储了方法的局部变量表、操作数栈、动态链接和方法返回地址等信息

栈内存为线程私有的空间,每个方法在执行时都会创建一个栈帧,执行该方法时,就会将该方法所对应的栈帧入栈

  • 局部变量表:用于存储方法参数和定义在方法体内部的局部变量,局部变量表的容量在编译器就被确定下来
  • 操作数栈:在方法执行过程中,根据字节码指令,往栈中写入数据或者提取数据,即入栈、出栈
  • 动态链接:每一个栈帧内部都包含一个指向 运行时常量池 中该栈所属方法的引用,包含这个引用的目的就是为了支持当前方法的代码能够实现动态链接,在 Java 源代码被编译为字节码文件时,所有变量和方法都为符号引用保存在 class 文件的常量池,动态链接的作用就是将这些符号引用转换为调用方法的直接引用
  • 方法返回地址:无论哪种方法,在方法退出后都该回到该方法被调用的位置,因此 方法返回地址 存储调用者的 pc 计数器的值

这里说一下符号引用和直接引用的区别?

符号引用的字面量明确定义在 《Java虚拟机规范》 的 Class 文件格式中

直接引用就是直接指向目标的指针、相对偏移量或简介定位到目标的句柄

栈会溢出吗?

虚拟机栈会溢出的,如果方法调用的过多,导致栈中压入的栈帧太多,就会出现 栈溢出错误

  • 如果线程请求的栈深度大于虚拟机所允许的深度(Xss默认1m),会抛出 StackOverflowError 异常
  • 如果在创建新的线程时,没有足够的内存去创建对应的虚拟机栈,会抛出 OutOfMemoryError 异常

静态方法不能使用 this,而非静态方法中可以使用 this?

如果当前帧(虚拟机栈最上方的帧,即当前执行方法的栈帧)是由构造方法或者实例方法所产生的,那么该对象的 this 引用会被放在局部变量表中 index 为 0 的地方,因此在示例方法和构造方法中可以使用 this 关键字,而在静态方法的局部变量表中没有存储 this 的引用,因此无法使用 this 关键字

可以在 IDEA 中安装 jclasslib 插件,通过该插件来查看文件的字节码:

public class Test {
    public void testThis() {
        int b = 100;
        System.out.println("testThis");
    }
    public static void testNoThis() {
        int a = 10;
        System.out.println("testNoThis");
    }
}

对于上述生成的字节码文件,我们可以看到 testThis 方法的局部变量表中有 this 变量,而 testNoThis 方法的局部变量表中没有 this 变量,如下图:

JVM虚拟机系统性学习-运行时数据区(虚拟机栈、本地方法栈)_局部变量_02

本地方法栈

本地方法栈是虚拟机所使用到的 本地方法 ,比如 C++ 方法

一个 Native 方法就是一个 Java 调用非 Java 代码的接口

为什么需要本地方法?

Java是一门高级语言,我们不直接与操作系统资源、系统硬件打交道。如果想要直接与操作系统与硬件打交道,就需要使用到本地方法了

底层就是这么实现的,在多线程部分就会有很多 Java 调用 Native 方法的示例

标签:Java,虚拟机,局部变量,系统性,线程,引用,JVM,方法
From: https://blog.51cto.com/u_16186397/8845243

相关文章

  • 玩转jvm
    1:什么是JVMJVM是Java虚拟机(JavaVirtualMachine)的缩写。它是Java编程语言的关键组成部分。JVM是一个运行在计算机上的虚拟机,它可以执行Java字节码(Javabytecode)程序。Java字节码是Java源代码经过编译后生成的中间代码,在JVM上可以被解释器实时地执行或者被编译成本地机器码执行......
  • springcloudalibabada搭建过程中springboot启动卡住起不来 (Started MoonceProviderApp
    如下图一样springcloudAlibaba在创建新模块之后启动新模块没有注册到nacos上,而是直接卡住起不来原因 原因是:引入了错误的web包: 解决办法:引入相应的 spring-boot-starter-web包:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot......
  • VMware Workstation 17中设置虚拟机开机自启动
    VMwareWorkstation17中设置虚拟机开机自启动的步骤如下:打开VMwareWorkstation17。在左侧导航栏点击配置自动启动虚拟机。然后选择要自动启动的虚拟机并配置启动顺序,点击确定。设置自动启动服务。打开任务管理器,点击服务,找到VmwareAutostartService,右键,点击开始。找到VMware......
  • 如何在 macOS Sonoma 虚拟机中安装 VMware Tools
     vmware-tools VMwareTools简介VMwareTools中包含一系列服务和模块,可在VMware产品中实现多种功能,从而使用户能够更好地管理客户机操作系统,以及与客户机操作系统进行无缝交互。VMwareTools具备以下功能:将消息从主机操作系统传递到客户机操作系统。将客户机操作......
  • Java-Jvm中GC类型及执行时机
    Java-Jvm中GC类型及执行时机堆的结构年轻代(YoungGeneration):Eden区:在年轻代中,对象首先被分配到Eden区。大多数对象很快就会被回收,所以它们被分配到Eden区以提高分配速度。Survivor区(S0和S1):Eden区中存活的对象会被移动到Survivor区。每次发生MinorGC时,存活的对象会被移......
  • VirtualBox 配置主机访问虚拟机,及CentOS 7.9安装
    CentOS7.9Everything下载地址:http://mirrors.163.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-Everything-2207-02.iso重启服务器。注意,必须重启才会生效。配置虚拟机和物理机的通信桥接模式:实现虚拟机在真实的网络上;NAT模式:实现虚拟机隐藏在......
  • Centos7虚拟机连不上网络
    使用VM创建并安装Centos7,完成之后发现网络不通(pingjd.com可以试一下)解决方法:1、在创建虚拟机的时候选择的是NAT模式 2、在虚拟机中,编辑->虚拟网络编辑器(记住子网IP、子网掩码、网关) 点击NAT设置 3、在Centos7中输入ipaddr,在这里是ens33(记住mac地址)4、在Centos7中输......
  • 让JVM适应Docker限制:动态调整内存
    背景在现代应用开发中,容器化技术(如Docker)已经成为主流。但是,Java应用在容器中运行时面临着挑战:传统的JVM内存设置需要在启动时指定静态的堆内存大小,这种设置方法难以适应动态变化的容器环境。由于容器环境受到cgroup限制,传统的静态内存配置可能导致资源不足或浪费。因此,让JVM能够感......
  • JVM虚拟机系统性学习-运行时数据区(堆)
    运行时数据区JVM由三部分组成:类加载系统、运行时数据区、执行引擎下边讲一下运行时数据区中的构成根据线程的使用情况分为两类:线程独享(此区域不需要垃圾回收)虚拟机栈、本地方法栈、程序计数器线程共享(数据存储区域,此区域需要垃圾回收)存储类的静态数据和对象数据堆和方法区堆Java......
  • 虚拟机安装Windows7 X64位教程以及解决VMTOOLS无法安装问题
    相关镜像文件的下载首先我们需要下载一个Windows7的镜像文件这里推荐迅雷下载,速度更快一点ed2k://|file|cn_windows_7_professional_x64_dvd_x15-65791.iso|3341268992|3474800521d169fbf3f5e527cd835156|h=TIYH37L3PBVMNCLT2EX5CSSEGXY6M47W|/虚拟机安装首页->新建虚拟机以上就是......