JVM - 认识JVM规范

news2024/12/23 23:08:47

目录

重识JVM

JVM规范作用及其核心

JVM 整体组成

理解ClassFile结构

ASM开发


  • 重识JVM

  • JVM概述
  • JVM:
    • Java Virtual Machine,也就是Java虚拟机
  • 所谓虚拟机是指:
    • 通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的计算机系统
  • JVM是通过软件来模拟Java字节码的指令集,是Java程序的运行环境
  • JVM主要功能
    • 1.通过ClassLoader寻找和装载class文件
    • 2.解释字节码成为指令并执行,提供class文件的运行环境
    • 3.进行运行期间的内存分配和垃圾回收
    • 4.提供与硬件交互的平台
  • 虚拟机是Java平台无关的保障

  • JVM规范作用及其核心

  • JVM规范作用
  • JVM虚拟机规范为不同的硬件平台提供了一种编译Java技术代码的规范
  • 该规范使Java软件独立于平台,因为编译是针对作为虚拟机的“一般机器”而做
  • 这个“一般机器”可用软件模拟并运行于各种现存的计算机系统,也可用硬件来实现
  • JVM规范定义的主要内容
  • 字节码指令集(相当于中央处理器CPU)
  • Class文件的格式
  • 数据类型和值
  • 运行时数据区
  • 栈帧
  • 特殊方法
  • 类库
  • 异常
  • 虚拟机的启动、加载、链接和初始化
  • JVM 整体组成

  • 1.类加载器(ClassLoader)
  • 2.运行时数据区(Runtime Data Area)
  • 3.执行引擎(Execution Engine)
  • 4.本地库接口(Native Interface)
  • 各个组成部分的用途:
  • 程序在执行之前先要把java代码转换成字节码(class文件)
  • jvm首先需要把字节码通过一定的方式 类加载器(ClassLoader) 把文件加载到内存中 运行时数据区(Runtime Data Area)
  • 而字节码文件是jvm的一套指令集规范,并不能直接交给底层操作系统去执行
  • 因此需要特定的命令解析器 执行引擎(Execution Engine) 将字节码翻译成底层系统指令再交由CPU去执行
  • 而这个过程中需要调用其他语言的接口 本地库接口(Native Interface) 来实现整个程序的功能
  • 这就是这4个主要组成部分的职责与功能
  • 而通常所说的jvm组成指的是运行时数据区(Runtime Data Area)
  • 因为通常需要程序员调试分析的区域就是“运行时数据区”,或者更具体的来说就是“运行时数据区”里面的Heap(堆)模块
  • 理解ClassFile结构

  • Class文件是JVM的输入,Java虚拟机规范中定义了Class文件的结构
  • Class文件是JVM实现平台无关、技术无关的基础
  • Class文件是一组以8字节为单位的字节流,各个数据项目按序紧凑排列
  • 对于占用空间大于8字节的数据项,按照高位在前的方式分割成多个8字节进行存储
  • Class文件格式里面只有两种类型:无符号数、表
    • 无符号数:基本数据类型,以u1、u2、u4、u8来代表几个字节的无符号数
    • 表:由多个无符号和其它表构成的复合数据类型,通常以"_info"结尾
  • 说明:
  • javap工具生成非正式的“虚拟机汇编语言”,格式如下:
    • <index><opcode>[<operand1>[<operand2>...]][<comment>]
  • <index>是指令操作码在数组中的下标,该数组以字节形式来存储当前方法的Java虚拟机代码;也可以是相对于方法起始处的字节偏移量
  • <opcode>是指令的助记码
  • <operand>是操作数
  • <comment>是行尾的注释
  • constant_pool_count:是从1开始的
  • 不同的常量类型,用tag来区分,它后面对应的info结构是不一样的
  • L表示对象,[ 表示数组、V表示void
  • stack:方法执行时,操作栈的深度
  • Locals:局部变量所需的存储空间,单位是 slot
  • slot是虚拟机为局部变量分配内存所使用的最小单位
  • args_size:参数个数,为1的话,因实例方法默认会传入 this,locals 也会预留一个slot来存放
  • ASM开发

  • ASM是一个Java字节码的操纵框架,它能被用来动态生成类或增强既有类的功能
  • ASM可以直接产生二进制class文件,也可以在类被加载入虚拟机之前动态改变类行为
  • ASM从类文件中读取信息后,能够改变类行为,分析类信息,甚至根据类的要求产生新类
  • 目前许多框架如cglib、Hibernate、Spring都直接或间接地使用ASM操作字节码
  • ASM编程模型
  • Core API:提供了基于事件形式的编程模型
    • 该模型不需要一次性将整个类的结构读取到内存中,因此这种方式更快,需要的内存更少,但这种编程方式难度较大
  • Tree API:提供了基于树型的编程模型
    • 该模型需要一次性将一个类的完整结构全部读取到内存中,所以这种方法需要更多的内存,这种编程方式较简单
  • ASM的Core API
  • ASM Core ApI 中操纵字节码的功能基于 ClassVisitor 接口
  • 这个接口中的每个方法对应了class文件中的每一项
  • ASM 提供了三个基于 ClassVisitor 接口的类来实现class文件的生成和转换
  • ClassReader:ClassReader解析一个类的class字节码
  • ClassAdapter:ClassAdapter是ClassVisitor的实现类,实现要变化的功能
  • ClassWriter:ClassWriter也是ClassVisitro的实现类,可以用来输出变化后的字节码
  • ASM给我们提供了 ASMifier 工具来帮助开发,可使用ASMifier工具生成ASM结构来对比

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

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

相关文章

InstructGPT

文章目录Abstract 给定人类的命令&#xff0c;并且用人工标注想要的结果&#xff0c;构成数据集&#xff0c;使用监督学习来微调GPT-3。 然后&#xff0c;我们对模型输出进行排名&#xff0c;构成新的数据集&#xff0c;我们利用强化学习来进一步微调这个监督模型。 我们把产…

day35|01背包问题、416. 分割等和子集

01背包问题 有n件物品和一个最多能背重量为w的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 例&#xff1a;背包最大重量为4。 物品为&#xff1a; 重量价值物品0115物品…

3种方法设置PDF“打开密码”,总有一种适合你

PDF文件是我们工作中经常用到的文件之一&#xff0c;对于重要的文件&#xff0c;设置“打开密码”是一种很好的保护方式。下面就来说说&#xff0c;设置PDF“打开密码”有哪三种方法&#xff1f; 方法一&#xff1a;在线网站加密 市面上有很多可以直接在线上加密PDF文件的产品…

Cortex-M0编程入门

目录1.嵌入式系统编程入门微控制器是如何启动的嵌入式程序设计2.输入和输出3.开发流程4.C编程和汇编编程5.什么是程序映像6.C编程&#xff1a;数据类型7.用C语言操作外设8.Cortex微控制器软件接口标准&#xff08;CMSIS&#xff09;简介标准化内容组织结构使用方法优势1.嵌入式…

综合项目 旅游网 【4.旅游线路名称查询-参数传递】

目录 查询参数的传递 route_list.html4.0代码 header.html2.0代码 修改后台代码 RouteServlet之前 RouteDaoImpl1.0 改进后的RouteDaoImpl2.0 改进后的RouteServlet2.0 ​编辑修改前台代码 route_list.html RouteServlet3.0 旅游线路的详情展示 分析 整体过程 代码实现…

【遇见青山】项目难点:缓存穿透的解决方案

【遇见青山】项目难点&#xff1a;缓存穿透的解决方案1.缓存穿透现象缓存空对象布隆过滤其他方案2.解决方案&#xff0c;缓存空数据1.缓存穿透现象 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效&#xff0c;这些请求都会打到数据…

常见的内存操作函数

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前是C语言学习者 ✈️专栏&#xff1a;C语言航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&a…

Java的异常处理

异常 异常就是程序非正常运行时的报错&#xff0c;不正常就是异常。 异常分类 通常分为两类&#xff1a; Error&#xff1a;错误。通常是Java虚拟机无法解决的严重问题。如&#xff1a;JVM系统内部错误、资源耗尽等严重情况。比如&#xff1a;StackOverflowError和OOM-->…

canvas根据坐标点位画图形-canvas拖拽编辑单个图形形状

首先在选中图形的时候需要用鼠标右击来弹出选择框&#xff0c;实现第一个编辑节点功能 在components文件夹下新建右键菜单 RightMenu文件&#xff1a; <template><div v-show"show" class"right-menu" :style"top:this.ypx;left:this.xpx…

PCB设计中的数据单位,层作用,工艺要求,制作过程等简介

PCB中常识 物理结构常识 几乎每层板子都是由两个金属层夹着一个绝缘层&#xff0c;像一个三明治结构。多层板是这种双层板叠加压合的。 常见的层的作用 参考&#xff1a;https://www.21ic.com/article/854059.html PCB电路板一般而言会分成六层&#xff0c;具体为&#x…

第二十四章 java并发常见知识内容(AQS)

JAVA重要知识点AQS介绍AQS的核心思想AQS资源共享方式自定义同步器常见同步工具类Semaphore(信号量)CountDownLatch(倒计时器)CyclicBarrier(循环栅栏)AQS 介绍 AQS 的全称为 AbstractQueuedSynchronizer &#xff0c;翻译过来的意思就是抽象队列同步器。这个类在 java.util.c…

图解 git 常用命令

本文图解 Git 中的最常用命令&#xff0c;如果你稍微理解 Git 的工作原理&#xff0c;这篇文章能够让你理解的更透彻。 基本用法 上面的四条命令在工作目录、暂存目录(也叫做索引)和仓库之间复制文件。 git add files 把当前文件放入暂存区域。 git commit 给暂存区域生成快照…

java集合:Collection:Set+List+Dueue

目录 Collection集合 1.常用方法 2.使用Iterator接口遍历集合元素 3.使用foreach循环遍历集合元素 4.Set集合 4.1 HashSet类 4.2 LinkedHashSet类 4.3 TreeSet类 4.4 EnumSet类 5. List接口 5.1 ListIteractor接口 5.2 Stack类 5.3 Arrays.ArrayList 5.4 Linke…

ChatGPT体验失败的经历

ChatGPT的介绍 最近有一个很热门的话题&#xff0c;而且这个话题内容已经覆盖了多个领域。ChatGPT这个词&#xff0c;最近不断的出现在微博的热搜或者公众号的文章里。那我们先大概了解一下ChatGPT。 ChatGPT是由OpenAI开发的一个人工智能聊天机器人程序&#xff0c;于2022年11…

在Allegro设计界面中如何修改封装焊盘

在Allegro PCB设计界面中修改封装焊盘的方法1、选择菜单Tools→Padstack→Modify Design Padstack...2、然后点击封装上要修改的焊盘&#xff0c;右击选择Edit或者点击Options选项卡下要修改的焊盘&#xff0c;然后点击Edit修改3、修改完焊盘后&#xff0c;选择File→Update to…

PyTorch学习笔记:nn.PReLU——PReLU激活函数

PyTorch学习笔记&#xff1a;nn.PReLU——PReLU激活函数 torch.nn.PReLU(num_parameters1, init0.25, deviceNone, dtypeNone)功能&#xff1a;逐元素对数据应用如下函数公式进行激活 PReLU(x)max⁡(0,x)a∗min⁡(0,x)\text{PReLU}(x)\max(0,x)a*\min(0,x) PReLU(x)max(0,x)a∗…

JS document.write()换行

换行效果&#xff1a; 通过传递多个参数&#xff0c;即可实现换行效果&#xff1a; document.write("<br>",ar) 效果&#xff1a; 示例源码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&quo…

Vue3 中 导航守卫 的使用

目录前言&#xff1a;一、什么是导航守卫&#xff1f;二、导航守卫有哪几种&#xff1f;1、全局守卫&#xff08;3个&#xff09;全局前置守卫全局解析守卫全局后置钩子2、路由独享守卫&#xff08;1个&#xff09;3、组件内守卫&#xff08;3个&#xff09;beforeRouteEnter(t…

大数据Kylin(二):Kylin安装使用

文章目录 Kylin安装使用 一、Kylin安装要求 二、Kylin安装 1、Kylin安装前环境准备

SpringCloud-Netflix学习笔记12——Hystrix-Dashboard实现服务监控

一、服务监控 hystrixDashboard 除了隔离依赖服务的调用以外&#xff0c;Hystrix还提供了准实时的调用监控&#xff08;Hystrix Dashboard&#xff09;&#xff0c;Hystrix会持续地记录所有通过Hystrix发起的请求的执行信息&#xff0c;并以统计报表和图形的形式展示给用户&…