对JVM的理解

对应JVM一直认为是非常高深的东西(确实不简单),不敢去折磨,最近看Android相关的知识想了解下Dalvik虚拟机,顺便了解了Java虚拟机,查了一些相关的资料,就当为自己mark。

1.JVM概念

JVM(Java Virtual Machine)是Java虚拟机

2.JVM与“Class文件”的关系

Java虚拟机只与“Class文件”关联,与语言和文件的来源无关,如:可以通过Java、Ruby生成一个class文件,甚至可以按照“Class文件”的文件格式自己手动编写一个class文件,但是这个文件有特定的结构,下面详细介绍。

3.class类文件结构

class文件是一组以8位字节为基础单位的二进制流,各种类型数据严格按照顺序紧密排列在一起,中间没有间隔,如果遇到大于8位字节的数据,则分割为多个8位字节进行存储。
如下为一个class类文件内部结构:
这里写图片描述

魔数
每个class文件头4个字节为魔数。他唯一的作用就是用来区别是不是Java虚拟机能个接受的class文件,Java虚拟机能接受的魔数是“CA FE BA BE”。

JDK版本
魔数后面的4个字节对应的是JDK版本,可以向后兼容,比如当前class是JDK 1.5生成的,则JDK 1.6可以接受,但是JDK 1.4不能接受。

常量池
常量池可以理解为class文件需要引用的类型,如Integer,Long等。


表包括字段表、方法表、属性表等,表可以理解为一个结构体。

类别长度具体内容

如:01/00 10/6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74:这是该常量池的第4项,CONSTANT_Utf8_info常量,长度是16(0x0010),正是字符串常量“java/lang /Object”。

4.字节码指令

Java虚拟机的指令只有一个字节的长度,所以指令的个数最多只有256个,并不是每一种类型都会有一个指令,会通过一些其它处理来合并指令。

01/00 10/6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74

5.虚拟机类加载

Created with Raphaël 2.1.0 加载 验证 准备 解析 初始化 使用 卸载

加载
加载class文件,class文件可以来至网络或本地等
验证
保证class文件字节流符合Java虚拟机的要求,并且不会危害到Java虚拟机。需要验证class文件内部的大致结构
准备
准备阶段是为类变量分配内存并设置变量的初始值,类变量是指static修饰的变量
解析
具体解析的过程
初始化
其它资源的初始化,如构造函数

6.类加载器

类加载器是用来加载类的。
- 两个类对象如果类加载器不同,是没有可比性的,一定不相等(equals和isInstances)
- 两个类对象如果类加载器相同,可以是相同的
- 类加载器可以直接通过构造函数参加,也可是系统类加载器

分类
Bootstrap ClassLoader
Extension ClassLoader
Application ClassLoader
User ClassLoader

Created with Raphaël 2.1.0 User ClassLoader Application ClassLoader Extension ClassLoader Bootstrap ClassLoader
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值