JVM基础-2-类加载机制
JVM基础介绍
为什么Java是一门跨平台的语言
计算机不能直接运行Java代码,因为在cpu层面看来计算机中所有的操作都是一个个指令的运行汇集而成的,java是高级语言,只有人类才能理解其逻辑,计算机是无法识别的,所以一般编程语言都是需要编译器翻译成计算机可以理解的机器语言,而Java是一门跨平台语言离不开JVM虚拟机,Java源码文件首先编译成字节码文件(.class文件), 再由不同平台的JVM进行解析使用,一次编译,到处运行靠的就是不同平台的JVM解析字节码文件适配不同平台的机器指令
类加载子系统
Java代码首先需要编译成字节码文件,交由JVM使用,接下来我们来了解JVM是怎么加载的
类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定(也成为动态绑定或晚期绑定)。另外注意这里的几个阶段是按顺序开始,而不是按顺序进行或完成,因为这些阶段通常都是互相交叉地混合进行的,通常在一个阶段执行的过程 ...
JVM基础-1-类字节码详解
Java字节码文件
class文件本质上是一个以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑的排列在class文件中。jvm根据其特定的规则解析该二进制数据,从而得到相关信息。
Class文件采用一种伪结构来存储数据,它有两种类型:无符号数和表
数据类型
定义
说明
无符号数
无符号数可以用来描述数字、索引引用、数量值或按照utf-8编码构成的字符串值。
其中无符号数属于基本的数据类型。 以u1、u2、u4、u8来分别代表1个字节、2个字节、4个字节和8个字节
表
表是由多个无符号数或其他表构成的复合数据结构。
所有的表都以“_info”结尾。 由于表没有固定长度,所以通常会在其前面加上两个字节作为个数说明。
Class文件的结构属性
从字节码文件中我们可以看到一堆的16进制字节,要想解读它就需要了解它排列的规则:
类型
名称
说明
长度
u4
magic
魔数,识别Class文件格式
4个字节
u2
minor_version
副版本号
2个字节
u2
major_version
主版本号
2个字节
u2
constan ...
synchronized详解
前置知识
对象头
众所周知,synchronized最常见的使用方式如下,其中obj就代表了锁对象
1234Object obj = new Object();synchronized(obj){ ...}
那么为什么synchronized需要使用一个对象作为锁呢?
首先,新建一个对象,他由两部分组成, 一部分是对象头, 另一部分才是对象的属性等内容. 而对象头的markword字段可以用来表示线程的状态
一般而言, 对象头有MarkWord 和 KlassWord(对象类型) 两部分组成,其中MarkWord组成结构(32为系统和64位系统):
其中Normal表示无锁状态, (一般新建对象的状态)
Biased 表示偏向锁状态,其中mardword前23位记录当前持有锁的线程id.
Lightweight Locked 表示轻量级锁, mark word前30位记录当前持有锁的线程的栈帧中锁记录结构地址.
heavyweight Locked 表示重量级锁, mark word前30位记录Monitor对象地址
Monitor对象
monito ...