JVM的栈内存

news2024/9/20 6:29:39

6cfb2b42d6be411ab59b93e32069d0d0.jpg  每当启动一个新线程时,Java虚拟机都会为它分配一个Java栈。Java栈以帧为单位保存线程的运行状态。虚拟机只会直接对Java栈执行两种操作:以帧为单位的压栈和出栈。

 

 

  某个线程正在执行的方法被称为该线程的当前方法,当前方法使用的栈帧称为当前帧,当前方法所属的类称为当前类,当前类的常量池称为当前常量池。在线程执行一个方法时,它会跟踪当前类和当前常量池。此外,当虚拟机遇到栈内操作指令时,它对当前帧内数据执行操作。

 

  每当线程调用一个Java方法时,虚拟机都会在该线程的Java栈中压入一个新帧。而这个新帧自然就成为了当前帧。在执行这个方法时,它使用这个帧来存储参数、局部变量、中间运算结果等数据。

 

  Java方法可以以两种方式完成。一种通过return返回的,称为正常返回;一种是通过抛出异常而异常终止的。不管以哪种方式返回,虚拟机都会将当前帧弹出Java栈然后释放掉,这样上一个方法的帧就成为当前帧了。

 

  Java帧上的所有数据都是此线程私有的。任何线程都不能访问另一个线程的栈数据,因此我们不需要考虑多线程情况下栈数据的访问同步问题。当一个线程调用一个方法时,方法的的局部变量保存在调用线程Java栈的帧中。只有一个线程能总是访问那些局部变量,即调用方法的线程。

 

 

 

 

 

JVM栈之局部变量表:包含参数和局部变量

局部变量表存放了基本数据类型、对象引用和returnAddress类型(指向一条字节码指令的地址)。其中64位长度的long和double类型的数据会占用2个局部变量空间(slot)(下图1到3的原因),其余数据类型只占用1个。局部变量表所需的内存空间在编译期间完成分配。每个方法都对应一个栈帧。

 

复制代码

复制代码

public class StackDemo {

    

    //静态方法

    public static int runStatic(int i, long l, float f, Object o, byte b) {

        return 0;

    }

 

    //实例方法

    public int runInstance(char c, short s, boolean b) {

        return 0;

    }

 

}

复制代码

复制代码

其对应的局部变量表如下:

 

 

 

上方表格中,静态方法和实例方法对应的局部变量表基本类似。但有以下区别:实例方法的表中,第一个位置存放的是当前对象的引用。

 

 

JVM栈之操作数栈

Java没有寄存器,所有参数传递都是使用操作数栈。

 

复制代码

public static int add(int a,int b){

        int c=0;

        c=a+b;

        return c;

    }

复制代码

压栈的步骤如下:

 

  0: iconst_0 // 0压栈

 

  1: istore_2 // 弹出int,存放于局部变量2

 

  2: iload_0 // 把局部变量0压栈

 

  3: iload_1 // 局部变量1压栈

 

  4: iadd //弹出2个变量,求和,结果压栈

 

  5: istore_2 //弹出结果,放于局部变量2

 

  6: iload_2 //局部变量2压栈

 

  7: ireturn //返回

 

如果计算100+98的值,那么操作数栈的变化如下图所示:

 

35721707-fff7-4516-86a7-dda30320dc06

 

 

 

 

 

JVM栈之栈上分配(动态链连接)

复制代码

小对象(一般几十个bytes),在没有逃逸的情况下,可以直接分配在栈上

 

直接分配在栈上,可以自动回收,减轻GC压力

 

大对象或者逃逸对象无法栈上分配

复制代码

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

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

相关文章

车载以太网 - SomeIP测试 - 初识 - 01

SOA,Service-Oriented Architecture,即面向服务的架构 SOA是一种面向服务的架构,定义了“服务器”和“客户端”,前者是服务、数据的提供者,后者是订阅了所需要的服务或者数据。应用程序之间是公三耦合,并通过服务总线作为中间件进行通信。SOA更像是一种框架,需要将信息从…

【JavaGuide面试总结】Java集合篇·下

【JavaGuide面试总结】Java集合篇下1.HashMap 的长度为什么是 2 的幂次方2.HashMap 有哪几种常见的遍历方式?3.HashSet 如何检查重复?4.ConcurrentHashMap 和 Hashtable 的区别5.ConcurrentHashMap 线程安全的具体实现方式/底层具体实现JDK1.8 之前JDK1.8 之后6.JDK 1.7 和 J…

从零编写linux0.11 - 第九章 文件系统(一)

从零编写linux0.11 - 第九章 文件系统(一) 编程环境:Ubuntu 20.04、gcc-9.4.0 代码仓库:https://gitee.com/AprilSloan/linux0.11-project linux0.11源码下载(不能直接编译,需进行修改) 本章…

【青训营】Go的一些性能优化技巧

一、Slice切片的性能优化 对Slice进行内存预分配 尽可能在使用make()初始化函数的时候提供容量信息,因为切片本质是一个数组片段的描述,其源码如下: type slice struct{array unsafe.Pointerlen int// 长度cap int// 容量 }如果没有指定容…

22.1.28打卡 Codeforces Round #847 (Div. 3) A~E

https://codeforces.com/contest/1790A. Polycarp and the Day of Pi题意问你第一个和"314159265358979323846264338327"不同的字符串下标1是什么如果全部相同输出最后一个下标1/* ⣿⣿⣿⣿⣿⣿⡷⣯⢿⣿⣷⣻⢯⣿⡽⣻⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣇⠸⣿⣿⣆…

Python基于LSTM预测特斯拉股票

Python基于LSTM预测特斯拉股票 提示:前言 Python基于LSTM预测特斯拉股票 股票预测是指:对股市具有深刻了解的证券分析人员根据股票行情的发展进行的对未来股市发展方向以及涨跌程度的预测行为。这种预测行为只是基于假定的因素为既定的前提条件为基础的…

通用智能基础模型假说

🍿*★,*:.☆欢迎您/$:*.★* 🍿 https://dongfangyou.blog.csdn.net/article/details/128761358 通过上面说的 人本身自带一个 各种行为反馈的评价模型 拥有这个模型便可拥有通用智能 简单的分析一下该模型到底应该由什么组成 最基础的模型是什么 首先人类最基础的模型应该…

【小程序】类taro语法中小程序端使用f2

前言 最近在类taro框架中小程序端使用最新版f2。(这里我使用rax)并封装了库,特此记录一下。 使用 想直接用的同学直接在你的rax项目中安装rax-my-f2这个包,他依赖antv/f2与antv/f2-context这2个包。 import { MyCanvas } from…

Kubernetes 笔记(06)— 搭建多节点集群、kubeadm 安装 master/worker/console/flannel 网络插件

1. kubeadm 官网:https://kubernetes.io/zh-cn/docs/reference/setup-tools/kubeadm/ 为了简化 Kubernetes 的部署工作,社区里就出现了一个专门用来在集群中安装 Kubernetes 的工具,名字就叫 kubeadm,意思就是 Kubernetes 管理员…

Java设计模式-状态模式State

介绍 状态模式(State Pattern):它主要用来解决对象在多种状态转换时,需要对外输出不同的行为的问题。状态和行为是一一对应的,状态之间可以相互转换。当一个对象的内在状态改变时,允许改变其行为&#xff…

学习记录677@项目管理之配置管理案例

案例 Simple公司的质量管理体系中的配置管理程序文件中有如下规定: (1)由变更控制委员会(CCB)制定项目的配置管理计划; (2)由配置管理员(CMO)创建配置管理环境: (3)由CCB 审核变更计划; (4)项目中配置基线的变更经过变更申请、变更评估、变更实施后便可发布; (5)CC…

Java基础10:常用API(下)

Java基础10:常用API(下)一、Date二、SimpleDateFormat三、Calendar四、ZoneId五、Instant六、ZoneDateTime七、DateTimeFormatter八、LocalDate、LocalTime、LocalDateTime九、Duration、Period、ChronoUnit十、包装类一、Date Date类是一个…

基于PIL和Tesseract的数字计算验证码识别处理思路

如图,我们在使用python自动化的时候经常会遇到很多各式各样的验证码。这个是一个数字加法的验证码。 干扰项里包含完整的数字、字母信息,普通的OCR识别可能不是很准确。 但是不管怎们样,咱们先把必要的环境搭建起来,试一下Tesseract的识别结果吧。 1、安装Tesseract: 首…

屏蔽360阻止运程执行变更注册表自启动数据的办法

屏蔽360阻止运程执行变更注册表自启动数据的办法 运程服务器上的程序,由于需要。我在服务器中,加入更新升级自身(exe)文件,并变更操作系统自启动数据的代码。 实践证明,通过客户端,调用运程服务…

全景解析SSD IO QoS性能优化

一、NAND基本原理目前NAND已经从SLC发展到PLC,但是PLC离大规模上市还有一段距离,我们暂时先略过。市面上主要流通的就是4种NAND类型:SLC、MLC、TLC、QLC。随着每个寿命从高到低依次是SLC>MLC>TLC>QLC.随着单个cell含有的bit数越多&a…

Unity MRTK使用详解(Htc vive+LeapMotion)

MRTK-Unity是一个由Microsoft驱动的开源项目,提供了多种组件和功能,用于加速Unity中的跨平台MR应用程序开发。以下是其一些功能: 提供跨平台输入系统和用于空间交互和UI组件。 启用快速原型通过在编辑器中的模拟,让你马上看到变化…

创建大量TCP连接时会受到什么因素的限制?

1.文件描述符资源 用户级限制 我们可以使用ulimit命令查看系统允许当前用户进程打开的文件数限制: ulimit -n 我们可以使用 ulimit -n 文件数 来修改不过这种设置是临时的,只在当前的session中有效。为永久修改用户级文件描述符数限制,可以…

SpringBoot框架介绍及使用

1. 概述 1.1 SpringBoot 简介 简化Spring应用开发的一个框架; 整个Spring技术栈的一个大整合; J2EE开发的一站式解决方案; 1.2 微服务 微服务:架构风格(服务微化) 一个应用应该是一组小型服务;…

【速记】离散分布的实现算法

离散分布与 zipf 分布 下面的一段代码&#xff0c;能根据数值描述来生成对应概率的离散值&#xff1a; #include <iostream> #include <iomanip> #include <map> #include <random>using namespace std;int main() {std::random_device rd;std::mt19…

「计算机组成原理」计算机系统概述

文章目录一、计算机发展历程1.1 什么是计算机系统1.2 硬件的发展1.2.1 硬件发展1.2.2 摩尔定律1.3 软件的发展1.4 目前的发展趋势二、计算机系统的多级层次结构2.1 编程语言的三个等级2.2 计算机系统层次结构三、计算机硬件的基本组成3.1 冯诺依曼结构3.2 现代计算机结构四、计…