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内存+垃圾回收器)详解
一:java代码的执行流程(引出JVM) 首先由程序员编写成.java文件 然后由javac(java编辑器)将.java文件编译成.class文件 .class文件可以在不同平台/操作系统上的JVM ...
- 【JVM】JVM内存模型(详细)
目录 一.JVM概述 1.jvm简介 2.jvm作用 3.jvm的内存模型 二.类加载器 1.类加载器的作用 2.加载器的类型 3.双亲委派机制的运行过程 4.双亲委派机制优缺点 5.为什么要破坏双亲 ...
- JVM(七) - Jvm内存模型
一.Jvm介绍 1.JVM内存模型图: JVM = 类加载器(classloader) + 运行时数据区域(runtime data area) + 执行引擎(execution engine) 类加 ...
- 一篇文章掌握整个JVM,JVM超详细解析!!!
JVM 先想想一些问题 1 我们开发人员编写的Java代码是怎么让电脑认识的 2 为什么说java是跨平台语言 3 Jdk和Jre和JVM的区别 4 为什么要学习JVM 深入学习JVM 1 JVM运行 ...
- 第五篇:初识JVM,JVM自动内存管理
文章目录 一.前言 1.1 计算机==>操作系统==>JVM 1.1.1 虚拟与实体(对上图的结构层次分析) 1.1.2 Java程序执行(对上图的箭头流程分析) 二.JVM内存空间与参数 ...
- JVM内功心法-JVM内存模型之内存区域
JVM内功心法-JVM内存模型之内存区域 程序计数器(线程隔离) 程序计数器(Program Counter Register):也叫PC寄存器,是一块较小的内存空间,它可以看做是当前线程所执行的字节 ...
- JVM详解——什么是JVM、JVM优点
JVM详解--什么是JVM.JVM优点 最近在学习Java,经常在书中看到JVM这三个字母,那到底什么是JVM呢? 并且JVM的知识在Java面试中也是非常受面试官青睐的知识点,那对于JVM我们到底要 ...
- 超硬核!!!一篇文章掌握整个JVM,JVM超详细解析!!!
JVM 先想想一些问题 1 我们开发人员编写的Java代码是怎么让电脑认识的 2 为什么说java是跨平台语言 3 Jdk和Jre和JVM的区别 4 为什么要学习JVM 深入学习JVM 1 JVM运行 ...
- JVM之JVM内存区域与内存分配(转载)
2019独角兽企业重金招聘Python工程师标准>>> 先来看看JVM运行时候的内存区域 大多数 JVM 将内存区域划分为 Method Area(Non-Heap)(方法区),He ...
最新文章
- 如何养成一个习惯(持续更新)
- jQuery Ajax 实例 全解析(转)
- java求助,JAVA求助大家帮忙下
- 最新17个紫色风格网页设计作品欣赏
- 探索C++的秘密之详解extern C
- 2019 秋招提前批蘑菇街一面面经(带答案)
- 项目展示-新浪微博客户端
- Codeforces Beta Round #22 (Div. 2 Only) E. Scheme(DFS+强连通)
- 听说你还不会写观察者模式?
- c语言如何找一个数的ac码,详细解析C语言中的开方实现
- Laser Reflections solutions
- c# 调用Minitab18.1实现直方图、质量正态图
- AD13如何导出坐标文件
- 【常用表】三角函数基本公式
- SecureCRT快捷键大全
- Linux调试工具:gdb的使用
- SLAM流程之视觉前端
- Paypal+本地支付,是跨境外贸收款最好的解决方案!
- php八字喜用神实现博客,八字喜用神测算方法
- centos7源代码编译安装heartbeat
热门文章
- Problem M: 定义类Shape、Rectangle、Circle和Square
- docker restart 参数详解
- 读《如何成为一个有趣的人》感想
- HTML小游戏5 —— 水果忍者(附完整源码)
- 玩水果忍者未能找到服务器,水果忍者无法连接服务器是什么原因
- 物联网设备大华、雄迈等设备存在弱口令漏洞及修复方案
- eureka和ZooKeeper的区别
- python中a* b是什么意思_python的 a,b=b,a+b 和 a=b b=a+b 的区别
- 计算机专业最新招聘信息示例,计算机专业个人鉴定示例
- Android是基于Linux的开源操作系统也是Linux内核