JVM - 认识JVM规范
目录
重识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结构来对比
相关文章:
JVM - 认识JVM规范
目录 重识JVM JVM规范作用及其核心 JVM 整体组成 理解ClassFile结构 ASM开发 重识JVM JVM概述JVM: Java Virtual Machine,也就是Java虚拟机所谓虚拟机是指: 通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的计算机系统…...
文献阅读笔记 # CodeBERT: A Pre-Trained Model for Programming and Natural Languages
《CodeBERT: A Pre-Trained Model for Programming and Natural Languages》EMNLP 2020 (CCF-B)作者主要是来自哈工大、中山大学的 MSRA 实习生和 MSRA、哈工大的研究员。资源:code | pdf相关资源:RoBERTa-base | CodeNN词汇: bimodal: 双模态…...
openHarmony的UI开发
自适应布局 拉伸能力 Blank在容器主轴方向上,空白填充组件具有自动填充容器空余部分的能力。仅当父组件为Row/Column时生效,即是线性布局。这样便可以在两个固定宽度或高度的组件中间添加一个Blank(),将剩余空间占满,从而实现…...
【JavaSE】深入HashMap
文章目录1. HashMap概述2. 哈希冲突3. 树化与退化3.1 树化的意义3.2 树的退化4. 二次哈希5. put方法源码分析6. key的设计7. 并发问题参考 如何防止因哈希碰撞引起的DoS攻击_hashmap dos攻击_双子孤狼的博客-CSDN博客 为什么 HashMap 要用 h^(h >>&#…...
华为机试题:HJ62 查找输入整数二进制中1的个数(python)
文章目录博主精品专栏导航知识点详解1、input():获取控制台(任意形式)的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方法2、print() :打印输出。1、整型int() :将指定进制…...
代码随想录训练营一刷总结|
分为几个大部分: 数组 最先接触的部分,虽然说感觉是最简单的,但是需要掌握好基础,特别是小心循环。这里面需要再仔细看的就是螺旋矩阵那一块,其他的在后续刷的时候能用一种方法一次a就行。 链表 需要注意链表的基础…...
CSS中的几种尺寸单位
一、尺寸单位 CSS 支持多种尺寸单位,包括: px:像素,固定大小单位em:相对于当前元素字体大小的单位rem:相对于根元素(HTML)字体大小的单位%:相对于父元素的百分比单位vh…...
运维必会:ansible剧本(piaybook)
playbooks 概述以及实例操作 Playbooks 组成部分: Inventory Modules Ad Hoc Commands Playbooks Tasks: 任务,即调用模块完成的某些操作 Variables: 变量 Templates: 模板 Handlers: 处理器,由某时间触发执行的操作 Roles: 角色 YAML 介绍…...
活动星投票午间修身自习室制作在线投票投票制作网页
“午间修身自习室”网络评选投票_免费小程序投票推广_小程序投票平台好处手机互联网给所有人都带来不同程度的便利,而微信已经成为国民的系统级别的应用。现在很多人都会在微信群或朋友圈里转发投票,对于运营及推广来说找一个合适的投票小程序能够提高工…...
C#泛型:高级静态语言的效率利器
文章目录引入类型约束子类泛型常用的泛型数据结构前文提要: 💎超快速成,零基础掌握C#开发中最重要的概念💎抽丝剥茧,C#面向对象快速上手💎Winform,最友好的桌面GUI框架💎懂了委托&a…...
澳大利亚访问学者申请流程总结
澳大利亚访问学者申请需要注意些什么?下面知识人网小编整理澳大利亚访问学者申请流程总结。1、取得wsk英语成绩,现在都是先买票再上车了。2、联系外导,申请意向接收函(email)。3、向留学基金委CSC提出申请。4、获批后,申请正式邀请…...
cookie和Session的作用和比较
目录 什么是cookie cookie的工作原理 什么是session Session的工作原理 为什么会有session和cookie cookie和session如何配合工作 cookie和Session作用 什么是会话 什么是cookie cookie是web服务器端向我们客户端发送的一块小文件,该文件是干嘛的呢…...
测试员都是背锅侠?测试人员避“锅”攻略,拿走不谢
最近发生了一起生产事故,究其根源,事故本身属于架构或者需求层面需要规避的问题,测试人员的责任其实是非常小的,但实际情况是:相关测试人员因此承担了很大的压力,成为质量问题的“背锅侠”。 实际上&#…...
C++: C++模板<template>
C template content😊前言😁模板💕1、泛型编程😍2、函数模板😒2.1:函数模板概念👌2.2:函数模板的格式😘2.3:函数模板原理😁2.4:函数模…...
chmod命令详解
用法:chmod [选项]… 模式[,模式]… 文件… 或:chmod [选项]… 八进制模式 文件… 或:chmod [选项]… --reference参考文件 文件… Change the mode of each FILE to MODE. With --reference, change the mode of each FILE to that of R…...
状态机设计中的关键技术
⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,结合Verilog HDL语言学习与仿真,主要对组合逻辑电路与时序逻辑电路进行分析与设计,对状态机FSM进行剖析与建模。 🔥文章和代码已归档至【Github仓库…...
单片机开发---ESP32S3移植NES模拟器(二)
书接上文 《单片机开发—ESP32-S3模块上手》 《单片机开发—ESP32S3移植lvgl触摸屏》 《单片机开发—ESP32S3移植NES模拟器(一)》 暖场视频,小时候称这个为—超级曲线射门!!!!!&am…...
微信小程序nodej‘s+vue警局便民服务管理系统
本文首先介绍了设计的背景与研究目的,其次介绍系统相关技术,重点叙述了系统功能分析以及详细设计,最后总结了系统的开发心得在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括“最多跑一次”微信小程序的网络应用,在外国小程序的使用已经是很普遍的方…...
第18章 MongoDB $type 操作符教程
MongoDB $type 操作符 描述 在本章节中,咱们将继续讨论MongoDB中条件操作符 $type。 $type操作符是基于BSON类型来检索集合中匹配的数据类型,并return 结果。 MongoDB 中可以使用的类型如下表所示: 类型数字备注Double1 String2 Object3…...
【MySQL主从复制】快速配置
本文配置环境Windows和Linux。 windows主 Linux 从 一、主库配置 首先保证Linux和防火墙开启3306端口或关闭防火墙。 登录Mysql管理员账户: GRANT REPLICATION slave,reload,super ON *.* TO root@从库ip地址 IDENtIFIED BY root; flush privileges; 本地的mysql可以被:…...
Typescript - interface 关键字(通俗易懂的详细教程)
前言 简单来说,Interface 就是一种描述对象或函数的东西。 您可以把 interface 理解为形状,真实开发情况下,一个对象需要有什么样的属性,函数需要什么参数或返回什么样的值,数组应该是什么样子的,一个类和继…...
【计组】内存和总线
课程链接:深入浅出计算机组成原理_组成原理_计算机基础-极客时间 一、虚拟内存和内存保护 日常使用的操作系统下,程序不能直接访问物理内存。内存需要被分成固定大小的页(Page),再通过虚拟内存地址(Virtu…...
CUDA中的数学方法
CUDA中的数学方法 文章目录CUDA中的数学方法1. Standard FunctionsSingle-Precision Floating-Point FunctionsDouble-Precision Floating-Point Functions2. Intrinsic FunctionsSingle-Precision Floating-Point FunctionsDouble-Precision Floating-Point Functions参考手册…...
Elasticsearch基本概念和索引原理
一、Elasticsearch是什么? Elasticsearch是一个基于文档的NoSQL数据库,是一个分布式、RESTful风格的搜索和数据分析引擎,同时也是Elastic Stack的核心,集中存储数据。Elasticsearch、Logstash、Kibana经常被用作日志分析系统&…...
《NFL橄榄球》:堪萨斯城酋长·橄榄1号位
堪萨斯城酋长队(Kansas City Chiefs)是位于密苏里州堪萨斯城的职业美式橄榄球队;目前在全国橄榄球联盟隶属于美国橄榄球联合会(AFC)西区;其夏季训练营在威斯康星大学河瀑校区举行。 酋长队的前身是达拉斯得州佬队,这支…...
python+django在线教学网上授课系统vue
随着科技的进步,互联网已经开始慢慢渗透到我们的生活和学习中,并且在各个领域占据着越来越重要的部分,很多传统的行业都将面临着巨大的挑战,包括学习也不例外。现在学习竞争越来越激烈,人才的需求量越来越大࿰…...
二叉搜索树之AVL树
AVL树的概念二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年 发明了一种解决上…...
全栈自动化测试技术笔记(二):准备工作的切入点
自动化测试技术笔记(二):准备工作的切入点 上篇整理的技术笔记,聊了自动化测试的前期调研工作如何开展,最后一部分也提到了工作的优先级区分。 这篇文章,接上篇文章的内容,来聊聊自动化测试前期的准备工作࿰…...
57 长短期记忆网络(LSTM)【动手学深度学习v2】
57 长短期记忆网络(LSTM)【动手学深度学习v2】 深度学习学习笔记 学习视频:https://www.bilibili.com/video/BV1JU4y1H7PC/?spm_id_fromautoNext&vd_source75dce036dc8244310435eaf03de4e330 长短期记忆网络(LSTM)…...
算法第十五期——动态规划(DP)之各种背包问题
目录 0、背包问题分类 1、 0/1背包简化版 【代码】 2、0/ 1背包的方案数 【思路】 【做法】 【代码】 空间优化1:交替滚动 空间优化2:自我滚动 3、完全背包 【思路】 【代码】 4、分组背包 核心代码 5、多重背包 多重背包解题思路1:转化…...
中国建设教育网站/百度权重3的网站值多少
前几天群里有人问我为什么直接操作数据库发布文章,插入成功了,却显示不出来。当时在外面玩儿,没法帮他,今天还没解决这个问题,抽点时间帮他一把。 WordPress的文章存在与wp_posts数据表中,里面有很多字段&…...
病毒疫情/信阳网站seo
<script type"text/javascript">//js的继承实现function Person() {// 定义基类的属性和方法this.name;this.age;this.say function () {alert(my name is: this.name);}this.showAge function () {alert(my age is: this.age);}}function Stu() {// 定义派…...
大学 英文网站建设/湖南关键词优化快速
在页面上显示SWF是要等到目标完全被加载完才会渲染出来。当加载的SWF文件比较大时,页面会处于空白状态,用户体验不好。较好的做法是做一个文件大小较小的loading动画来加载目标SWF,但对于单独的项目来说并不是最好的做法,因为这样…...
网站建设类有哪些岗位/青岛网站建设培训学校
理解javascript中的MVC MVC模式是软件工程中一种软件架构模式,一般把软件模式分为三部分,模型(Model)视图(View)控制器(Controller); 模型:模型用于封装与应用程序的业务逻辑相关的数据以及对数据处理的方法。模型有对数据直接访问的权利。模…...
wordpress博客主题源码/国际军事新闻最新消息
教程: 1、将下载好的压缩包进行解压缩并运行安装,选择语言中文简体 2、选择WorkNC 2021,点击下一步 3、阅读软件许可协议,勾选我接受协议 4、选择安装位置,点击浏览可自行更换安装路径 5、选择开始菜单文件夹…...
从零做网站/域名检测查询
tail -f 等同于--followdescriptor,根据文件描述符进行追踪,当文件改名或被删除,追踪停止 tail -F 等同于--followname --retry,根据文件名进行追踪,并保持重试,即该文件被删除或改名后ÿ…...