首页 > 其他分享 >JVM 由哪几部分组成?

JVM 由哪几部分组成?

时间:2024-11-04 17:45:14浏览次数:3  
标签:操作数 方法 线程 JVM 执行 哪几 栈帧 组成

JVM的组成

我们先笼统的总结一下

  • 类装载子系统
  • 运行时的数据区(内存)
    • 堆区(heap) : new 出来的对象都放到堆里
    • 栈区(stack):线程栈,线程私有,存放线程用到 的局部变量,执行方法的时候,就会将用到的方法插入栈,一个方法对应于一个栈帧。
    • 方法区(method area):存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。JDK 8开始,HotSpot将永久代(Permanent Generation)移除,取而代之的是元空间(Metaspace)。
    • 程序计数器(PC): 指向当前指令指向的地址
  • 字节码执行引擎

其实就这三部分,但是主要我们要了解它的流程
我画了一张图,大家可以看一下请添加图片描述

第一步:

jdk将.java文件编译为.class字节码文件,

第二步:

字节码执行引擎将 A.class 文件放入JVM数据区,内存
此时我们需要了解一下JVM的内存模型:

JVM的数据区由五个部分组成

  • 堆区(heap) : new 出来的对象都放到堆里
  • 栈区(stack):线程栈,线程私有,存放线程用到 的局部变量,执行方法的时候,就会将用到的方法插入栈,一个方法对应于一个栈帧。
  • 方法区(method area):存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。JDK 8开始,HotSpot将永久代(Permanent Generation)移除,取而代之的是元空间(Metaspace)。
  • 程序计数器(PC): 指向当前指令指向的地址

我们主要讲一下 栈区:

**每个线程在执行时从栈区分配一块空间,每一个线程都会占据栈区的一处空间,所以又叫做线程栈,每个线程分配的空间叫做一个栈帧**

栈帧的组成部分:

  • 局部变量表:
    • 存储方法的局部变量,包括基本数据类型(如 int、float 等)、对象引用和返回地址等。
    • 局部变量表的大小在编译时确定,根据方法中声明的变量数量分配空间。
    • 方法调用时传递的参数也存储在局部变量表中。
  • 操作数栈:
    • 用于执行字节码指令时的操作数临时存储。
    • 操作数栈的大小在编译时确定,栈帧的每条指令通过操作数栈进行计算和存储中间结果。
    • 比如,进行加法操作时,两个操作数会从操作数栈中取出,结果会压回操作数栈中。
  • 动态链接
    • 用于支持方法调用时的符号引用到实际方法引用的解析(即连接到当前方法的常量池)。
    • 每个栈帧包含一个指向常量池的引用,用于访问方法的相关符号信息和字段。
  • 方法返回地址
    • 保存了方法执行结束后的返回地址,用于返回到调用该方法的位置。
    • 如果方法调用后需要返回给调用者,则返回地址会记录到栈帧中。

所以说,操作数中如果有引用数据类型,那么一定有变量指向堆区,每个栈也有一个指针指向方法区。

而函数真正的执行流程,大家可以去看操作系统(计算机组成原理) ,主要是通过PC(程序下一步执行的地址),来控制整个程序的执行,那么有一个问题,PC由谁控制呢?

是由我们JVM的第三个部分,JVM字节码执行引擎来决定的。

所以图上显示,字节码执行引擎控制 PC, 然后PC控制每一个线程栈的执行,进而控制整个程序。

标签:操作数,方法,线程,JVM,执行,哪几,栈帧,组成
From: https://blog.csdn.net/weixin_45691703/article/details/143488056

相关文章

  • 实例化对象有哪几种方式
    1.**new关键字**  Useruser=newUser(); 2.**clone()方法**  UserclonedUser=originalUser.clone();3.**通过反射机制创建**  Class<?>cls=Class.forName("com.dao.User");  Useru=(User)cls.newInstance();4.**序列化反序列化**  序列化是......
  • 实例化对象有哪几种方式
    1.**new关键字**  Useruser=newUser(); 2.**clone()方法**  UserclonedUser=originalUser.clone();3.**通过反射机制创建**  Class<?>cls=Class.forName("com.dao.User");  Useru=(User)cls.newInstance();4.**序列化反序列化**  序列化是......
  • Java路线图:Java基础入门、Java核心技术、JVM和性能优化、web服务器、web开发框架、消
    准备下载、配置Maven下载、安装IntelliJIDEA准备一个GitHub仓库(或者码云),管理Java源代码Java基础入门1)基本数据类型8种基本数据类型(boolean、char、byte、short、int、long、float、double)整形中byte、short、int、long的取值范围单精度和双精度为什么不能使用......
  • 【Google Cloud】专用 Google 访问通道的组成和利用方法详解
    专用Google访问通道(PrivateGoogleAccess)允许从没有外部IP的虚拟机访问GoogleCloud服务的API。本文将详细介绍此功能。什么是专用Google访问通道专用Google访问通道(PrivateGoogleAccess)是指在GoogleCloud(原称GCP)中,允许没有外部IP(公网IP)的虚拟机或本地......
  • JVM-GC调优
    GC调优GC调优指的是对垃圾回收(GarbageCollection)进行调优。GC调优的主要目标是避免由垃圾回收引起程序性能下降。GC调优的核心分成三部分:1、通用Jvm参数的设置。2、特定垃圾回收器的Jvm参数的设置。3、解决由频繁的FULLGC引起的程序性能问题。GC调优没有没有唯一的标准......
  • Java面试题虚拟机为什么使用元空间替换了永久代(JVM篇)
    前言本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!虚拟机为什么使用元空间替换了永久代?似乎有点模糊了,那就大概看一下面试题吧。好记性不如烂键盘***12万字的java面试题整理***虚拟机为什么使用元空间替换了永久代「什么是元空间?什么是永久代?为什么用元空间代替永久......
  • Java面试题虚拟机为什么使用元空间替换了永久代(JVM篇)
    前言本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!虚拟机为什么使用元空间替换了永久代?似乎有点模糊了,那就大概看一下面试题吧。好记性不如烂键盘***12万字的java面试题整理***虚拟机为什么使用元空间替换了永久代***「什么是元空间?什么是永久代?为什么用元空间......
  • 一般的Java项目需要JVM调优吗_1
    为比亚迪车主推荐比亚迪车友群比亚迪元UP盘锦车友群_盘锦车友欢聚,欢迎车主加入比亚迪元pro江门车友群_江门比亚迪元pro车友会比亚迪宋pro汉川车友群_汉川车友欢聚,欢迎车主加入比亚迪宋pro耒阳车友群_耒阳车友欢聚,欢迎车主加入比亚迪宋pro宿州车友群_宿州宋pro车主交流......
  • JVM学习总结
    JVM是什么?JVM是java程序运行环境,它可以做到一次编译,到处运行一、大体上由四部分组成    1.类加载子系统:     根据给定的全限定名类名(如:java.lang.Object)来装载class文件到运行时数据区中的方法区    2.执行引擎:      负责解释命......
  • Java面试题中高级进阶(JVM调优篇)
    前言本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!调优命令有哪些?常见调优工具有哪些?MinorGC与FullGC分别在什么时候发生?你知道哪些JVM性能调优参数(简单版回答)?对象一定分配在堆中吗?有没有了解逃逸分析技术?似乎有点模糊了,那就大概看一下面试题吧。好记性不如烂键......