JVM(Java虚拟机)的核心组成

news/2025/3/23 0:41:01/
1. 类加载器(Class Loader)
  • 功能:负责将.class文件加载到内存,并转换为JVM可识别的数据结构。

  • 分类

    • 启动类加载器(Bootstrap Class Loader):加载JAVA_HOME/lib下的核心类库(如rt.jar)。

    • 扩展类加载器(Extension Class Loader):加载JAVA_HOME/lib/ext下的扩展类。

    • 应用程序类加载器(Application Class Loader):加载用户类路径(ClassPath)的类。

    • 自定义类加载器:用户可继承ClassLoader实现自定义加载逻辑。

  • 双亲委派模型:优先由父类加载器尝试加载类,避免重复加载并确保安全。


2. 运行时数据区(Runtime Data Areas)

JVM内存管理的核心区域,分为线程私有和共享区域:

2.1 线程私有区域
  • 程序计数器(Program Counter Register)

    • 记录当前线程执行的字节码指令地址。

    • 唯一不会发生内存溢出的区域。

  • 虚拟机栈(Java Virtual Machine Stack)

    • 存储方法调用的栈帧(Frame),每个栈帧包含:

      • 局部变量表:方法参数和局部变量。

      • 操作数栈:执行字节码指令的工作区。

      • 动态链接:指向运行时常量池的方法引用。

      • 返回地址:方法执行后的返回位置。

    • 可能抛出StackOverflowError(栈深度过大)和OutOfMemoryError(扩展失败)。

  • 本地方法栈(Native Method Stack)

    • 为Native方法(如C/C++实现)服务,结构与虚拟机栈类似。

2.2 线程共享区域
  • 堆(Heap)

    • 存储所有对象实例和数组。

    • 分为新生代(Young Gen)和老年代(Old Gen):

      • 新生代:Eden区、Survivor区(From/To),使用复制算法回收。

      • 老年代:存放长期存活对象,使用标记-整理或标记-清除算法。

    • 可能抛出OutOfMemoryError

  • 方法区(Method Area)

    • 存储类元数据(如类名、字段、方法)、常量池、静态变量等。

    • 实现变化

      • JDK 8前:永久代(PermGen),受JVM内存限制。

      • JDK 8+:元空间(Metaspace),使用本地内存(Native Memory)。

  • 运行时常量池(Runtime Constant Pool)

    • 方法区的一部分,存储类文件中的常量(如字符串字面量、符号引用)。


3. 执行引擎(Execution Engine)

负责将字节码翻译为机器码并执行:

  • 解释器(Interpreter)

    • 逐行解释执行字节码,启动速度快但执行效率低。

  • 即时编译器(JIT Compiler)

    • 将热点代码(频繁执行的代码)编译为本地机器码,提升执行效率。

    • 主流JVM(如HotSpot)采用分层编译(C1、C2编译器)。

  • 垃圾回收器(Garbage Collector)

    • 自动回收堆中不再使用的对象内存,常见算法:

      • 标记-清除(Mark-Sweep):简单但产生内存碎片。

      • 复制(Copying):用于新生代,无碎片但内存利用率低。

      • 标记-整理(Mark-Compact):用于老年代,避免碎片。


4. 本地方法接口(JNI, Java Native Interface)
  • 功能:允许Java代码调用本地方法(Native Method,如C/C++库)。

  • 示例System.currentTimeMillis()底层通过JNI调用操作系统API。


5. 本地方法库(Native Libraries)
  • 组成:包含JVM所需的本地库(如libjvm.solibjava.so)。

  • 作用:支持JVM与操作系统交互(如线程调度、文件操作)。


JVM内存结构示意图

总结

  • 核心组件:类加载器、运行时数据区、执行引擎、本地接口及库。

  • 内存管理:堆和方法区是内存管理的重点,垃圾回收机制保障内存高效利用。

  • 性能优化:通过JIT编译、分代回收、元空间替代永久代等手段提升效率。

  • 线程安全:私有区域隔离线程状态,共享区域需同步机制(如锁、CAS)。

理解JVM组成及工作原理,是优化Java程序性能、解决内存泄漏和并发问题的关键基础。


http://www.ppmy.cn/news/1581259.html

相关文章

SQL Server 2014 (x64) 中文版安装与使用指南(附安装包)

SQL Server 2014 (x64) - CHS 是 Microsoft SQL Server 2014 的中文版,适用于 64 位操作系统。以下是关于该版本的一些关键信息: SQL Server 2014 (x64)安装装包下载地址链接:https://pan.quark.cn/s/a5d01527a246 1. 版本类型 CHS 表示中文…

【Node.js入门笔记9---path 模块】

Node.js入门笔记9 Node.js---path 模块一、核心功能0.学习path的前提1. 使用 path.join() 安全拼接路径2. path.resolve(),路径解析(绝对路径)3. 路径信息提取4. 路径规范化 二、跨平台关键点1. 路径分隔符2. 环境变量分隔符3. 路径格式解析4…

使用LangChain实现基于LLM和RAG的PDF问答系统

目录 前言一.大语言模型(LLM)1. 什么是LLM?2. LLM 的能力与特点 二、增强检索生成(RAG)三. 什么是 LangChain?1. LangChain 的核心功能2. LangChain 的优势3. LangChain 的应用场景4. 总结 四.使用 LangChain 实现基于 PDF 的问答系统 前言 本文将介绍 …

泰迪智能科技大模型开发平台与大模型应用平台介绍

大模型开发平台是一款面向高校大模型教学、科研的一站式大模型开发工具。平台能够自定义调用CPU和内存资源,自由配置专门针对大模型和深度学习等任务的硬件加速器(如GPU或XPU),能够高效地执行大模型的prompt工程、大模型应用开发和…

【Linux】浅谈环境变量和进程地址空间

一、环境变量 基本概念 环境变量(Environment Variables)是操作系统提供的一种机制,用于存储和传递配置信息、系统参数、用户偏好设置等。 环境变量的作用 配置程序行为: 程序可以通过环境变量获取配置信息,例如日…

vue3父子组件传值

在 Vue 3 中,Composition API 是一种新的编写组件逻辑的方式,它通过 setup 函数提供了一种更灵活的方式来组织和复用代码。与传统的 Options API 相比,Composition API 更适合处理复杂的逻辑场景,尤其是在需要跨组件复用逻辑时。 …

如何理解std::promise和std::future

std::promise 是 C11 引入的一个类,用于在线程之间传递异步结果(值或异常)。它通常与 std::future 配合使用,std::promise 用于设置值或异常,而 std::future 用于获取这些值或异常。 下面通过一个更直观的生产者-消费者…

红数码影视(RED Digital Cinema)存储卡格式化后的恢复方法

红数码影视(RED Digital Cinema)的摄像机可以生成两种RAW级高清视频文件,一种是R3D,一种是MOV。其中MOV属于苹果(apple)公司的QT视频封装结构,使用的视频编码是Apple ProRes;而R3D则是RED公司自创的RAW视频文件,这种文件解码需要使…