首页 > 系统相关 >JVM之内存结构

JVM之内存结构

时间:2023-08-12 17:44:40浏览次数:38  
标签:int 局部变量 value 线程 内存 JVM 方法 结构

从整体上看JVM的内存分为两大类:线程私有的和线程共享的。

线程私有:

  1. 程序计数器
  2. 虚拟机栈
  3. 本地方法栈

线程共享:

  1. 堆区
  2. 方法区

程序计数器

主要作用就是记住下一条JVM指令的执行地址。因为在多线程的情况下,同一个时间单核CPU只会执行一个线程中的方法,也就是说CPU会不断切换执行的线程,那么线程会不断的中断和恢复,这就要求线程在中断前就要记住当前的运行状态,从而下一次恢复时能继续向下执行。

虚拟机栈

其实就是我们通常理解的栈,而栈内又存放这一个一个栈帧,每一次的方法调用都会有一个新的栈帧入栈。

每一个栈帧主要包含四个方面:

  1. 局部变量表
    • 主要用于存储方法参数和方法内的局部变量,局部变量又包含:Java基本的数据类型、对象的引用
    • 局部变量表所需要的大小是在编译期内确定的
    • 由于局部变量只在当前变量中有效,所以不存在线程安全的问题
    • 局部变量表最基本的存储单元是Slot(为什么很多的地方都有最基本的存储单元,他的好处是什么?),32位以内的类型只占用一个Slot,64位的类型(long和double)占用两个连续的Slot,byte、short、char在存储前被转换为int,boolean也被转换为int,0表示false,非0表示true。

      为什么byte、short、char在存储前被转换为int?
      有一种说法是:因为JVM指令中的操作码只占一个字节,也就是说最多只有256个不同的操作码,如果给每一个数据类型都定义一个不同的操作码的话会不够用。比如:iadd,将栈中两个int类型相加,但是并没有针对short类型的“sadd”.【2】

    • 阿萨德
  2. 操作数栈
    • 主要用于保存计算过程的中间结果,同时作为计算过程中变量临时的存储空间
    • int a = 5;
      int b = 10;
      int result = a + b;
      // 对应字节码
      0: iconst_5          // Push the value 5 onto the stack
      1: istore_1          // Store the value into local variable 'a'
      2: bipush 10         // Push the value 10 onto the stack
      4: istore_2          // Store the value into local variable 'b'
      5: iload_1           // Push the value of 'a' onto the stack
      6: iload_2           // Push the value of 'b' onto the stack
      7: iadd              // Pop the top two values, add them, and push the result
      8: istore_3          // Store the result into local variable 'result'
      
  3. 动态链接
    • 动态链接是指向运行时常量池的方法引用
    • 在Java源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用保存在Class文件的常量池(Class文件中都包含什么?)中。比如:描述一个方法调用了另外的其他方法时,就是通过常量池中指向方法的符号引用来表示的,那么动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用。
    • 静态链接 or 动态链接,早期绑定 or 晚期绑定
    • 虚方法和非虚方法:如果方法在编译器就确定了具体的调用版本,这个版本在运行时是不可变的。这样的方法称为非虚方法,比如静态方法、私有方法、final 方法、实例构造器、父类方法都是非虚方法,其他方法称为虚方法。
    • 虚方法表:在面向对象编程中,会频繁的使用到动态分派,如果每次动态分派都要重新在类的方法元数据中搜索合适的目标有可能会影响到执行效率。为了提高性能,JVM 采用在类的方法区建立一个虚方法表,使用索引表来代替查找。非虚方法不会出现在表中。每个类中都有一个虚方法表,表中存放着各个方法的实际入口。虚方法表会在类加载的连接阶段被创建并开始初始化,类的变量初始值准备完成之后,JVM 会把该类的方法表也初始化完毕。
  4. 方法返回地址
    • 用来存放调用该方法的PC寄存器的值。方法正常退出时,调用者的PC计数器的值作为返回地址,即调用该方法的指令的下一条指令的地址。而通过异常退出的,返回地址是要通过异常表来确定的,栈帧中一般不会保存这部分信息。

参考

  1. https://www.pdai.tech/ JVM内存结构部分
  2. https://cloud.tencent.com/developer/news/735870

标签:int,局部变量,value,线程,内存,JVM,方法,结构
From: https://www.cnblogs.com/optimjie/p/17625156.html

相关文章

  • 考研数据结构——每日一题[Dijkstra求最短路]
    849.Dijkstra求最短路I给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值。请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出−1。输入格式第一行包含整数n和m。接下来m行每行包含三个整数x,y,z,表示存在一条从点x到点......
  • linux查看内存
    linux查看内存多大的方法:1、执行“free-m”命令,输出列表的“total”项值就是查询的总内存数;2、执行“cat/proc/meminfo”命令,可显示内存的详细信息,输出列表的“MemTotal”项值就是查询的总内存大小。本教程操作环境:linux5.9.8系统、DellG3电脑。linux查看内存多大的方法1......
  • c语言精通学习「1」: 内存
    1.为什么需要内存(1)计算机为什么需要编程?为什么要写新的程序?计算机编程主要注重两点,结果和过程。比如下面的代码看重的是结果intadd(inta,intb)){returna+b;}下面的代码看重的是过程voidadd(inta,intb){printf("%d",a+b);}而下面的代码既......
  • pandas-基础数据结构
    pandas-基础数据结构目录pandas-基础数据结构数据结构Series创建Series常用操作索引缺失数据添加和修改删除DataFrame创建DataFrame常用操作索引和切片添加和修改索引后修改删除参考资料数据结构Pandas的主要数据结构是Series(一维数据)与DataFrame(二维数据)⽆论是numpy中的NAN......
  • 内存中缓存cache和缓冲buff的概念
    total总物理内存used已经使用的物理内存free没有使用过的物理内存shared多进程共享内存buff/cache读写缓存内存,这部分内存是当空闲来用的,当free内存不足时,linux内核会将此内存释放buff缓冲 为了提高操作系统的写能力cache缓存  为了提高操作系统的读能力Linux操作系......
  • 《CUDA编程:基础与实践》读书笔记(5):统一内存编程
    统一内存(unifiedmemory)是一种逻辑上的概念,它既不是显存、也不是主机内存,而是CPU和GPU都可以访问并能保证一致性的虚拟存储器。使用统一内存对硬件有较高的要求:对于所有功能,GPU架构都必须不低于Kepler架构,主机应用程序必须为64位。对于一些较新的功能,至少需要Pascal架构的GPU......
  • iovec结构体
    iovec基本介绍包含在头文件#include<sys/uio.h>中的一个结构体其定义如下structiovec{ void*iov_base; //指向数据的地址 size_tiov_len; //数据的长度};其实就是一个指向一块内存的指针,同时携带了数据长度而已干嘛用的服务于以下两个函数intreadv(intfd,co......
  • 「算法与数据结构」从入门到进阶吐血整理推荐书单
    一.入门系列这些书籍通过图片、打比方等通俗易懂的方法来讲述,让你能达到懂一些基础算法,线性表,堆栈,队列,树,图,DP算法,背包问题等,不要求会实现,但是看过以下这些书对于之后实现算法打下坚实的思维基础。很适合在闲暇之余拿出来阅读一番。1.1《啊哈!算法》这不过是一本有趣的算法书而......
  • 想进大厂?先把这些数据结构与算法学明白!!!
    *文末有1元解锁专栏福利今天聊聊掌握了不一定能拿到大厂Offer,但不掌握一定进不去大厂的神技「数据结构与算法」。为什么突然提到了数据结构与算法呢?这要从一个朋友的吐槽开始。我这位朋友一心想进大厂,学历还不错、能力也不错,但就是拿不到大厂Offer。大家都劝他多刷LeetCode,把......
  • R语言结构方程模型SEM、路径分析房价和犯罪率数据、预测智力影响因素可视化2案例|附代
    原文链接:http://tecdat.cn/?p=25044原文出处:拓端数据部落公众号最近我们被客户要求撰写关于结构方程模型的研究报告,包括一些图形和统计输出。1简介在本文,我们将考虑观察/显示所有变量的模型,以及具有潜在变量的模型。第一种有时称为“路径分析”,而后者有时称为“测量模型”。......