目录
一.概述。
二.Java虚拟机的结构
三、对象的创建
四.对象的堆内存布局
五.oop-klass模型
六.垃圾标记算法:引用计数算法和根搜索算法。
七.垃圾收集算法:
一.概述。
1.JDK:包含JRE、Java语言、Java API类库(Java调试开发工具以及Java基础类库)三部分,是Java程序开发的最小环境。
2.JRE:包含Java语言的核心类库和Java虚拟机两部分,是Java运行的标准环境。
jdk与jre联系与区别
3.Java虚拟机:是整个Java平台运行的基石,是Java语言编译代码的运行平台。
4.Java虚拟机家族:HotSpot VM,J9 VM,Zing VM。
5.Java虚拟机执行流程:
分成两个部分:编译时环境和运行时环境
①.编译时环境:将Java文件(或者Kotlin其他等)编译成class文件。
②.运行时环境:class文件由Java虚拟机来处理。
结论:Java虚拟机与Java语言没有什么必然联系,它只与特定的二进制文件:Class文件有关。
二.Java虚拟机的结构
Java虚拟机包括运行时数据区域、执行引擎、本地库接口、本地方法库,其中类加载子系统并不属于Java虚拟机内部结构。
1.Class文件格式:Java文件被编译后生成Class文件,这种二进制格式文件不依赖于特定的硬件和操作系统。
2.类的生命周期:一个Java文件被加载到Java虚拟机内存中到从内存中卸载的过程。
过程:加载、链接(验证、准备和解析)、初始化、使用和卸载。
3.类加载子系统:类加载子系统通过多种类加载器来查找和加载Class文件到虚拟机中。Java虚拟机有两种加载器:系统加载器和自定义加载器。
系统加载器:引导类加载器、扩展类加载器、应用程序类加载器。
4.运行时数据区域:根据《Java虚拟机规范(Java SE7版)》规定,区域分别是程序计数器、Java虚拟机栈、本地方法栈、Java堆和方法区。
①.程序计数器:私有线程,为了保证程序能连续的执行下去,处理器必须具有某些手段来确定下一条指令的地址,而程序计数器就是起到这个作用。此内存区是唯一一个在java虚拟机规范中没有规定OutOfMemoryError情况的区域。
②.Java虚拟机栈:私有线程,存储着Java方法的调用状态,包括局部变量、参数、返回值及运算的中间结果等。平时说的栈内存就是指Java虚拟机栈。具体内部存储着栈帧里面存放了方法的局部变量表、操作数栈、动态链接方法、返回地址、附加信息等信息,局部变量表中存储着编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型,它不等同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关位置)和returnAddress类型(指向了一条字节码指令的地址)
③.本地方法栈:与Java虚拟机栈类似,只不过是用来支持本地方法的。
④.Java堆:线程共享,用来存放对象的实例。
⑤.方法区(永久代):线程共享,用来存储已经被Java虚拟机加载的类的结构信息,包括运行时常量池、字段和方法信息、静态变量等数据。主要是用来存放静态文件。
具体详细java内存模型参考:
Android开发中关于内存的那些事,一篇全搞懂
三、对象的创建
1.判断对象对应的类是否加载、链接和初始化。
2.在Java堆中为对象分配内存,方式:指针碰撞和空闲列表。
3.处理并发安全问题。
4.初始化分配到内存空间。
5.设置对象的对象头。
6.执行init方法进行初始化。
四.对象的堆内存布局
堆内存的布局包括三个区域:对象头、实例数据、对齐填充。
五.oop-klass模型
用来描述Java对象实例的一种模型。
六.垃圾标记算法:引用计数算法和根搜索算法。
七.垃圾收集算法:
1.标记-清除算法
2.复制算法(新生代使用)
3.压缩算法(老年代使用)
4.分代收集算法