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

news/2024/11/5 13:09:16 标签: 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 可以有效地管理内存,减少内存泄漏和溢出的问题,提高程序的稳定性和性能


http://www.niftyadmin.cn/n/5739501.html

相关文章

第七部分:1. STM32之ADC实验--单通道实验

主要利用一个模拟量的电位器来实时改变电压值,通过STM32自带的ADC通道来采集这个数据,并打印出来! 一句话,学完STM32,我就往南走,我的工资只有5000.~~~~Whappy

缓存-基础概念

1、缓存的基本思想 缓存的基本思想就是空间换时间,用更多的存储空间来存储一些可能重复使用或计算的数据,从而减少数据的重新获取或计算的时间。空间换时间的例子 索引:将数据库表中的默写列或字段按照一定的排序规则组织成一个单独的数据结…

人工智能技术在网络安全领域被恶意利用

知识图谱 1. 量子信息技术├── 1.1 量子计算│ └── 威胁现有密码学│ └── 抗量子攻击的密码算法├── 1.2 量子通信│ └── 极高的安全性│ └── 量子密钥分发 (QKD)│ └── 检测窃听行为2. 云计算├── 2.1 多…

Python详细实现快速幂算法

目录 Python详细实现快速幂算法引言一、快速幂算法的理论基础1.1 幂运算1.2 快速幂算法的基本思想1.3 快速幂算法的时间复杂度 二、Python实现快速幂算法2.1 基本实现代码解析: 2.2 非递归实现代码解析: 2.3 优化:带模运算的快速幂模快速幂算…

动态代理-整理

1. JDK 动态代理 JDK 自带的动态代理基于 接口 实现。它主要依赖 java.lang.reflect.Proxy 类和 InvocationHandler 接口。 InvocationHandler:用于定义代理类中方法的处理逻辑。代理对象的方法调用会被重定向到 InvocationHandler 的 invoke 方法。Proxy.newProxyI…

软件测试学习笔记丨Flask框架-集成Swagger文档

本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/23424 介绍 接口文档对于前后端开发人员都十分重要。尤其近几年流行前后端分离后,编写接口文档更是重中之重。但是由于项目周期等原因后端人员经常出现无法及时更新,导…

github - ssh 配置 key、下载repo

1、设置位置 https://github.com/settings/keys 2、生成 Key ssh-keygen -t rsa -b 4096 -C "xx@x.com" 成功后,查看 cat ~/.ssh/id_rsa.pub 得到数据类似: ssh-rsa AAAAB3NzaC1yc2EA...4thQm4FKtB/c= xx3、下载代码 下载方式,选择 ssh,但使用 git clone 下…

02多线程基础知识

目录 1. 线程与进程 进程(Process) 线程(Thread) 2. 并发和并行 并发(Concurrency) 并行(Parallelism) 3. CPU 调度 定义 类型 调度算法 上下文切换 4.线程间的状态流转…