JVM基本结构和垃圾回收机制

一、JVM基本结构

Java虚拟机(JVM, Java Virtual Machine)是Java程序执行的环境,其基本结构可以分为以下几个主要部分:

  1. 类加载器子系统(Class Loader Subsystem)

    • 负责加载Java类文件到内存中。它包括三个主要的类加载器:引导类加载器、扩展类加载器和应用程序类加载器。
    • 类加载器采用双亲委派模型,以确保Java类的安全性和一致性。
  2. 内存区(Runtime Data Area):

    • JVM在运行Java程序时,会在内存中分配不同的区域来存储数据。主要包括:
      • 方法区(Method Area):存放类的结构信息,如字段、方法、常量池等。
      • 堆区(Heap Area):用于存放对象实例和数组,是Java内存管理的主要区域。
      • Java栈(Java Stack):每个线程都有自己的Java栈,用于存放局部变量、操作数栈、动态链接等信息。
      • 程序计数器(Program Counter Register):每个线程都有一个程序计数器,用于指示当前线程执行的字节码指令地址。
      • 本地方法栈(Native Method Stack):用于支持Java调用本地方法(Native Method)。
  3. 执行引擎(Execution Engine)

    • 负责执行字节码,包括:
      • 解释器(Interpreter):逐行解释执行字节码。
      • 即时编译器(JIT Compiler):将热点代码编译为本地机器码,以提高执行效率。
      • 垃圾回收器(Garbage Collector):负责自动管理内存,回收不再使用的对象。
  4. 本地库接口(Native Interface):Java 程序可以调用本地代码,从而实现对系统资源的直接访问或使用现有的本地库。

JVM的设计使得Java程序具有跨平台的特性,即"编写一次,到处运行"。通过将Java代码编译为字节码,JVM能够在不同的操作系统和硬件平台上执行这些字节码。

二、JVM 内存区 ----- 两栈一器私有,堆和方法区共享

1、堆(线程共享)

堆中存放几乎所有对象实例,所有程序所创建的对象均保存在堆中

2、Java虚拟机栈(线程私有)
虚拟机栈存放的是各类基本数据类型和对象的引用,包含四部分

  1. 局部变量表: 存放了编译器可知的各种基本数据类型(8大基本数据类型)、对象引用。局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是完全确定的,在执行期间不会改变局部变量表大小。简单来说就是存放方法参数和局部变量。
  2. 操作栈:每个方法会生成一个先进后出的操作栈。
  3. 动态链接:指向运行时常量池的方法引用。
  4. 方法返回地址:PC 寄存器的地址。

3、本地方法栈(线程私有)

本地方法栈和虚拟机栈类似,只不过虚拟机栈是给JVM使用的,本地方法栈是给本地方法使用的

4、程序计数器(线程私有)
每条线程都有自己的程序计数器,用来记录代码执行到的位置(行号)

5、方法区(线程共享)

用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

三、垃圾回收机制

JVM 垃圾回收机制--GC(Garbage Collection) 是 Java 虚拟机自动管理内存的一种方式,旨在回收不再使用的对象,以释放内存空间。以下是 JVM 垃圾回收机制的主要特点和工作原理:

1. 垃圾回收的基本概念

  • 垃圾对象:指没有任何引用指向的对象,这些对象无法再被程序访问。
  • 内存管理:JVM 自动管理内存的分配和释放,程序员无需手动释放内存。

2. 垃圾回收的工作原理

JVM 的垃圾回收通常通过以下几个步骤进行:

  • 标记:首先,JVM 会从根对象(如栈中的局部变量、静态变量等)开始,遍历所有可达对象,并标记这些对象为"活着"的对象。
  • 清除:在标记阶段结束后,JVM 会清除未被标记的对象,释放其占用的内存。
  • 整理(可选):在某些垃圾回收算法中,清除后会进行内存整理,将存活的对象移动到一起,以减少内存碎片。

3. 垃圾回收器

JVM 提供了多种垃圾回收器,常见的包括:

  • Serial GC:单线程的垃圾回收器,适用于小型应用。
  • Parallel GC:多线程的垃圾回收器,提高了垃圾回收的效率。
  • CMS(Concurrent Mark-Sweep):并发标记清除垃圾回收器,减少停顿时间。
  • G1(Garbage-First):能够同时进行垃圾回收和应用程序的执行,适用于大内存应用。

4. 垃圾回收的触发

垃圾回收通常在情况下触发:

  • 当堆内存达到一定阈值时。
  • 当系统内存不足时。
  • 手动调用 System.gc()(建议不使用,因为并不能保证立即回收)。

通过垃圾回收机制,JVM 可以有效地管理内存,减少内存泄漏和溢出的问题,提高程序的稳定性和性能

相关推荐
流星5211228 小时前
GC 如何判断对象该回收?从可达性分析到回收时机的关键逻辑
java·jvm·笔记·学习·算法
JanelSirry8 小时前
我的应用 Full GC 频繁,怎么优化?
jvm
JH30739 小时前
jvm,tomcat,spring的bean容器,三者的关系
jvm·spring·tomcat
DKPT12 小时前
JVM直接内存和堆内存比例如何设置?
java·jvm·笔记·学习·spring
siriuuus13 小时前
JVM 垃圾收集器相关知识总结
java·jvm
小满、15 小时前
什么是栈?深入理解 JVM 中的栈结构
java·jvm·1024程序员节
百花~1 天前
JVM(Java虚拟机)~
java·开发语言·jvm
每天进步一点点dlb1 天前
JVM中的垃圾回收算法和垃圾回收器
jvm·算法
漫漫不慢.1 天前
蓝桥杯-16955 岁月流转
java·jvm·蓝桥杯
boy快快长大2 天前
【JVM】线上JVM堆内存报警,占用超90%
jvm