JVM上篇:内存与垃圾回收篇
📄️ 1. JVM与Java体系结构
本文主要讲述JVM体系结构、Java发展过程中的重大事件、各个厂商的JVM对比、JVM架构模型的特点等内容。
📄️ 2. 类加载器子系统
本文主要介绍类加载子系统,其中包括类的加载过程:加载、链接、初始化;以及 ClassLoader 的分类和 ClassLoader 的双亲委派机制等内容。
📄️ 3. 运行时数据区概述及线程
运行时数据区(Runtime Data Areas)是指在程序在运行过程中,由Java虚拟机(JVM)管理的各种内存空间。这些数据区域主要用于存储程序运行时所需的数据,包括程序的字节码、类信息、对象实例、方法等。在Java虚拟机规范中,主要的运行时数据区包括以下几个部分:**程序计数器(Program Counter)、Java虚拟机栈(JVM Stacks)、堆(Heap)、方法区(Method Area)、运行时常量池(Runtime Constant Pool)、本地方法栈(Native Method Stack)**。
📄️ 4. 程序计数器
JVM 中的程序计数寄存器(Program Counter Register)中,Register 的命名源于 CPU 的寄存器,寄存器存储指令相关的现场信息。CPU 只有把数据装载到寄存器才能够运行。
📄️ 5. 虚拟机栈
虚拟机栈是Java虚拟机为每个线程分配的内存区域,用于存储方法的局部变量、部分方法信息以及方法调用和返回的状态。每个方法在执行时都会创建一个栈帧,栈帧随着方法的调用和返回而入栈和出栈。栈的大小可以固定或动态扩展,栈的深度受限于具体的JVM实现。虚拟机栈是线程私有的,保证了线程执行过程中的数据独立性和安全性。
📄️ 6. 本地方法接口
本地方法接口(Native Method Interface,JNI)是 Java 提供的一种机制,允许 Java 代码与本地(非 Java)代码进行交互。通过 JNI,Java 程序可以调用 C、C++ 等编写的本地代码,也可以让本地代码调用 Java 代码。JNI 提供了一组标准的接口和约定,用于在 Java 虚拟机中动态加载和调用本地方法。这种能力使得 Java 在需要与操作系统、硬件或其他非 Java 代码交互的场景下更为灵活和强大,同时需要注意 JNI 使用时需要小心管理内存和确保跨语言调用的正确性。
📄️ 7. 本地方法栈
- Java 虚拟机栈于管理 Java 方法的调用,而本地方法栈用于管理本地方法的调用。
📄️ 8. 堆
Java虚拟机(JVM)堆是JVM内存模型的一部分,是用来存储对象实例和数组的内存区域。在Java应用程序运行时,所有的对象实例都在堆上分配。堆是由垃圾收集器管理的,这意味着当对象不再被引用时,垃圾收集器会自动回收这些对象占用的内存。本文的主要内容包括堆空间的内部结构、内存管理(分代)、对象的分配过程、逃逸分析、标量替换等内容。
📄️ 9. 方法区
JVM的方法区是Java虚拟机中用于存储类元数据的特殊内存区域。在Java 8之前,方法区通常通过永久代(PermGen)实现,但在Java 8及之后的版本中,它被元空间(Metaspace)所取代,这一改革是为了解决原有永久代大小固定的问题,并且将方法区的存储位置从Java堆移动到本地内存。本文主要介绍方法区的结构、方法区内存大小的设置、方法区的垃圾回收以及常量池等内容。
📄️ 10. 对象的实例化内存布局与访问定位
10.1 对象的实例化
📄️ 11. 直接内存
直接内存概述
📄️ 12. 执行引擎
12.1 执行引擎概述
📄️ 13. StringTable
13.1 String的基本特性
📄️ 14. 垃圾回收概述
14.1 什么是垃圾
📄️ 15. 垃圾回收相关算法
15.1 标记阶段:引用计数算法
📄️ 16. 垃圾回收相关概念
16.1 System.gc()的理解
📄️ 17. 垃圾回收器
17.1 GC分类与性能指标
3~10:主要为运行时数据区
13:StringTable应对属于运行时数据区,但是因为面试的时候经常问,所以单独成章,单独讲解一下。
13~16:主要是垃圾回收相关内容
相关资料
这部分对应虚拟机规范中的第二部分:
其他官方资料