目录

一.概述。

二.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虚拟机的结构

android 进阶解密 第十章 Java虚拟机_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内存模型参考:

JVM:Java虚拟机的内存模型 - 知乎Java虚拟机将其内存分为五个部分 1.程序计数器 2.虚拟机栈(Java栈) 3.本地方法栈 4.Java堆 5.方法区用途: 程序计数器用于存放下一条运行的指令 虚拟机栈和本地方法栈用于存放函数调用堆栈信息 Java堆用于存放Ja…

android 进阶解密 第十章 Java虚拟机_本地方法_02

https://zhuanlan.zhihu.com/p/60140105

Android开发中关于内存的那些事,一篇全搞懂

三、对象的创建

1.判断对象对应的类是否加载、链接和初始化。

2.在Java堆中为对象分配内存,方式:指针碰撞和空闲列表。

3.处理并发安全问题。

4.初始化分配到内存空间。

5.设置对象的对象头。

6.执行init方法进行初始化。

四.对象的堆内存布局

堆内存的布局包括三个区域:对象头、实例数据、对齐填充。

五.oop-klass模型

用来描述Java对象实例的一种模型。

六.垃圾标记算法:引用计数算法和根搜索算法。

七.垃圾收集算法:

1.标记-清除算法

2.复制算法(新生代使用)

3.压缩算法(老年代使用)

4.分代收集算法