从执行class文件开始认识JVM

这篇具有很好参考价值的文章主要介绍了从执行class文件开始认识JVM。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

编写好的java文件经过javac编译成class文件,使用java命令执行对应得我class文件,这时候jvm开始运行
首先,jvm需要将class文件装载进入内存空间(类加载机制)
在内存中分配空间(认识JVM运行时数据区)

类加载机制

类加载分为几个步骤

  1. 装载

class文件装载进JVM首先要进行的就是要将对应的字节码数据装载进内存空间,需要知道字节码文件地址,装载到内存中哪个区域,怎么使用这些数据?这里牵出装载阶段主要做的3件事

通过全类名获取定义类的二进制字节流
将字节码对应的静态数据结构转换成方法区的运行时数据结构
在堆中生成class对象,当做这些数据的访问入口

  1. 连接

连接阶段有三个步骤:验证、准备、解析
**验证 **-> 验证字节码文件的准确性,安全性等,防止威胁到虚拟机的安全
**准备 **-> 正式为类变量(静态变量)分配内存空间并附默认值(比如int默认值为0)

这里需要注意jdk1.7和之前,类变量在方法区中分配空间
jdk1.8之后,字符串常量池和静态变量移动到堆中分配空间

解析 -> 将符号引用转换成直接引用

通俗理解就是将class文件中的那些表示不同类型或者值的符号转换成内存空间中的地址

  1. 初始化

初始化阶段是执行方法,该方法在编译后自动生成,用于给静态变量赋值等

JVM中的内存区域

上面已经提到过方法区和堆,大致知道以下两点:

  1. 方法区 由线程共享 主要存储加载到虚拟机中的类信息,字段信息,方法信息,常量,静态变量以及即时编译器编译后的代码缓存等

方法区只是一个概念
JDK1.7和之前使用永久代实现方法区
JDK1.8之后使用Meta Space元空间实现方法区,并且不再在JVM的运行时数据区,而是直接使用本机内存

  1. 堆 由线程共享,主要存储几乎所有的对象信息

认识到以上几点以后,开始考虑,现在class文件已经加载进入JVM的内存空间中,那么方法执行过程中需要做什么,对应的需要哪些内存区域?

  1. 虚拟机栈 线程独享,每调用一个方法压入一个栈帧,栈帧中保存着局部变量表,操作数栈、动态链接、方法返回地址等信息,每执行完一个方法就会弹出相应的栈帧
  2. 程序计数器 现成独享,因为CPU的高速轮换需要在切换线程时记录当前线程执行的位置等信息
  3. 本地方法栈 作用和虚拟机栈相同,虚拟机栈用于执行Java方法,本地方法栈用于执行native方法

双亲委派模型

类加载过程中的第一步,装载class字节码文件,需要用到类加载器,虚拟机中的类加载器分为三个:
根加载器(启动类加载器)
扩展类加载器
应用类加载器
三个加载器各自负责加载的位置不同,并且他们通过持有上一级加载器对象实现组合关系
在loadClass方法中,
首先检查自己是否加载过,如果没有加载过,调用组合关系中的上一级来加载
当上一级发现自己也没有加载过,继续调用自己的上一级来加载,直到上一级为空,说明当前是根加载器
然后根加载器就会开始尝试从自己负责的范围开始加载,找不到就返回null
当下一级接收到的对象为null时,开始尝试从自己负责的范围开始加载,同样找不到就返回null
直到最终的应用类加载器或者自定义加载器
想要破坏双亲委派模型需要重写loadClass方法文章来源地址https://www.toymoban.com/news/detail-689647.html

到了这里,关于从执行class文件开始认识JVM的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 认识JVM

    ✏️作者:银河罐头 📋系列专栏:JavaEE 🌲 “种一棵树最好的时间是十年前,其次是现在” 推荐一本书:《深入理解 Java 虚拟机》。 JVM(Java Virtual Machine)内存区域划分,JVM 类加载机制,JVM 垃圾回收机制。 HotSpot VM : 最主流的 JVM,Oracle 官方 jdk 和开源的 openjdk ,都是使用这个

    2023年04月14日
    浏览(25)
  • 【基础篇】一、认识JVM

    虚拟机,Virtual Machine,一台虚拟的计算机,用来执行虚拟计算机指令。分为: 系统虚拟机:如VMware,是完全对物理计算机的仿真 程序虚拟机:如JVM,专门为执行单个计算机程序而设计,JVM中执行的指令就是Java字节码指令 不论是哪种类型虚拟机,其上面运行的软件或者程序,

    2024年02月03日
    浏览(33)
  • 认识JVM的内存模型

    从上一节了解到整个JVM大的内存区域,分为线程共享的heap(堆),MethodArea(方法区),和线程独享的 The pc Register(程序计数器)、Java Virtual Machine Stacks(Java虚拟机栈)、Native Method Stacks(本地方法栈),如下图 同时也大概了解到各个内存区域主要存储的数据类型,根据之前

    2024年02月10日
    浏览(31)
  • JVM第一篇 认识java虚拟机

    目录 1. 什么是java虚拟机 2. java虚拟机分类 2.1. 商用虚拟机 2.2. 嵌入式虚拟机 3.java虚拟机架构 4.java虚拟机运行过程        传统意义上的虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的,是操作系统级别的虚拟机。Java虚拟机是一种程序

    2024年02月11日
    浏览(40)
  • 【JVM】JVM之执行引擎

    本文我们将讲解JVM中的执行引擎。 问题:我们平时所写的Java程序是如何将其进行编译并转换为计算机能够识别的机器码呢?并且Java程序编译和C/C++程序编译有什么区别呢?我们所说的JIT编译器和平时说的编译器有什么区别呢?…我相信在阅读本文过后,你会有一个清楚的认

    2023年04月21日
    浏览(40)
  • 【JVM】JVM执行流程 && JVM类加载 && 垃圾回收机制等

    目录 🌷1、JVM是什么? 🌷2、JVM的执行流程(能够描述数据区5部分) 🌷3、JVM类加载过程 🌷4、双亲委派机制:描述类加载的过程 问题1:类加载器 问题2:什么是双亲委派模型?  问题3:双亲委派模型的优点 🌷5、垃圾回收机制(重要,针对的是堆)    问题1:判定对象

    2024年02月15日
    浏览(57)
  • 形象谈JVM-第二章-认识编译器

    我在上一章《形象谈JVM-第一章-认识JVM》提到的“翻译”,其实就是我们今天所说的“编译”的概念。 上一章原文链接:https://www.cnblogs.com/xingxiangtan/p/17617654.html 原文: 【 虚拟机的职责是将字节码翻译成对应系统能够识别并执行的机器码, 比如在linux系统,java文件被javac编译

    2024年02月13日
    浏览(41)
  • jvm 什么是常量池,常量池定义 class常量池

    首先需要理解下Java的class文件,以及class文件结构: 1. Class文件 是一组以8个字节为基础单位的 二进制流 ,各个数据项目严格按照顺序紧凑地排列在文 件之中, 中间没有任何分隔符 ,这使得整个Class文件中存储的内容几乎全部是程序运行的必要数据, 没有空隙存在 。当遇到

    2024年02月11日
    浏览(38)
  • 了解 JVM - 认识垃圾回收机制与类加载过程

    本篇通过介绍JVM是什么,认识JVM的内存区域的划分,了解类加载过程,JVM中垃圾回收机制,从中了解到垃圾回收机制中如何找到存活对象的方式,引用计数与可达性分析的方式,再释放垃圾对象时使用的方式,标准清除,复制算法,标准整理,分代回收等等,如有错误,请在

    2024年02月16日
    浏览(39)
  • 从官网认识 JDK,JRE,JVM 三者的关系

    点击下方关注我,然后右上角点击...“设为星标”,就能第一时间收到更新推送啦~~~ JVM 是一些大厂面试必问点,要想解决 OOM、性能调优方面的问题,掌握 JVM 知识必不可少,从今天开始,将为大家介绍 JVM 的常用知识。 1、Java 官网 Java 官网主页:https://docs.oracle.com/en/java/in

    2024年02月15日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包