Java虚拟机
--摘自《Android进阶解密》
1.常说的JDK包含了Java语言、Java虚拟机和Java API类库这三部分,是Java程序开发的最小环境
2.JRE包含了JavaAPI中的Java SE API子集和Java虚拟机两个部分,是Java程序运行的标准环境
3.Java虚拟机上运行的语言不仅仅是Java,还包括Kotlin、Groovy、Scala、Jython等
4.Java虚拟机家族包括Oracle的HotSpot VM、IBM的J9 VM、Oracle的Zing VM
*Java虚拟机执行流程*
1.一个Java文件经过Java编译器编译后会生成Class文件,这个Class文件会由Java虚拟机来进行处理。
2.Java虚拟机与Java语言没有什么必然的联系,它只与特定的二进制文件:Class文件有关
*Java虚拟机结构*
1.类的生命周期
一个Java文件被加载到Java虚拟机内存中到从内存中卸载的过程被称为类的生命周期
1)加载:查找并加载Class文件
1.1)根据特定名称查找类或接口类型的二进制字节流
1.2)将这个二进制字节流所代表的静态存储结构转化为方法区的运行时数据结构
1.3)在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口
2)链接:包括验证、准备和解析
2.1)验证:确保被导入类型的正确性
2.2)准备:为类的静态字段分配字段,并用默认值初始化这些字段
2.3)解析:虚拟机将常量池内的符号引用替换为直接引用
3)初始化:将类变量初始化为正确初始值
2.程序计数器:为了保证程序能够连续的执行下去,处理器必须具有某些手段来确定下一条指令的地址
3.方法区:被所有线程共享的运行时内存区域,用来存储已经被Java虚拟机加载的类的结构信息,包括运行时常量池、字段和方法信息、静态变量等数据
*对象的创建*
1)判断对象对应的类是否加载、链接和初始化
2)为对象分配内存
3)处理并发安全问题
4)初始化分配到的内存空间
5)设置对象的对象头
6)执行init方法进行初始化
*垃圾标记算法*
1.GC主要做了两个工作,一个是内存的划分和分配,另一个是对垃圾进行回收
2.目前有两种垃圾标记算法,分别是引用计数算法和根搜索算法
3.可以作为GC Roots的对象主要有以下几种
1)Java栈中引用的对象
2)本地方法栈中JNI引用的对象
3)方法区中运行时常量池引用的对象
4)方法区中静态属性引用的对象
5)运行中的线程
6)由引导类加载器加载的对象
7)GC控制的对象
4.复制算法被广泛应用于新生代中
5.标记-压缩算法被广泛应用于老年代中
6.HotSpot虚拟机默认Eden空间和两个Survivor空间的所占的比例为8:1
*Java对象在虚拟机中的生命周期*
1.创建阶段
1)为对象分配存储空间
2)构造对象
3)从超类到子类对static成员进行初始化
4)递归调用超类的构造方法
5)调用子类的构造方法
2.应用阶段
3.不可见阶段
4.不可达阶段
5.收集阶段
6.终结阶段
7.对象空间重新分配阶段
欢迎关注我的微信公众号:安卓圈