JVM 的组成

JVM(Java Virtual Machine)是 Java 的核心组件,负责执行 Java 字节码程序。以下是 JVM 的主要组成部分:


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

  • 作用:负责加载 .class 文件到 JVM,将其转换为 JVM 能识别的内部数据结构。
  • 组成
    • Bootstrap ClassLoader(引导类加载器):加载 JDK 核心类库(rt.jar)。
    • Extension ClassLoader(扩展类加载器):加载扩展库(lib/ext 中的类)。
    • Application ClassLoader(应用类加载器):加载应用程序的类路径中的类。
  • 过程
    • 加载(Loading):通过文件、网络等方式加载 .class 文件。
    • 验证(Verification):确保字节码文件的合法性和安全性。
    • 准备(Preparation):为类的静态字段分配内存并赋默认值。
    • 解析(Resolution):将符号引用转换为直接引用。
    • 初始化(Initialization):执行类的静态代码块或初始化静态字段。

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

JVM 为执行 Java 程序分配的内存区域,包括以下部分:

a. 方法区(Method Area)

  • 存储

    • 类元信息(类名、方法名、字段名等)。
    • 静态变量。
    • 运行时常量池。
  • 特点
    • 是线程共享的。
    • 在 JDK 8 以前对应于永久代(PermGen),在 JDK 8 后改为元空间(Metaspace)。

b. 堆区(Heap Area)

  • 存储

    • 所有对象实例和数组。
  • 特点
    • 是线程共享的。
    • 垃圾回收(GC)主要针对堆区。
    • 通常分为年轻代(Young Generation)、老年代(Old Generation)和永久代(PermGen,JDK 8 以后移除)。

c. Java 栈区(Java Stack Area)

  • 存储

    • 方法调用的局部变量。
    • 每个方法调用对应一个栈帧(Frame)。
  • 特点
    • 是线程私有的。
    • 方法调用结束后,栈帧会弹出,内存自动回收。

d. 程序计数器(Program Counter Register)

  • 功能

    • 记录当前线程正在执行的字节码指令地址。
  • 特点
    • 是线程私有的。

e. 本地方法栈(Native Method Stack)

  • 功能

    • 为本地方法(非 Java 方法,如通过 JNI 调用的 C 或 C++ 方法)服务。
  • 特点
    • 是线程私有的。

3. 执行引擎(Execution Engine)

  • 作用:负责执行字节码。
  • 组成
    • 解释器(Interpreter):逐条解释字节码并执行。
    • 即时编译器(JIT Compiler)
      • 热点代码(频繁执行的代码)会被 JIT 编译为机器码,以提高执行速度。
      • 包括 C1(Client Compiler,快速编译)和 C2(Server Compiler,高性能优化)。
    • 垃圾回收器(Garbage Collector,GC)
      • 自动回收不再使用的对象所占的内存。

4. 本地方法接口(Native Interface)

  • 作用:提供调用非 Java 代码(如 C、C++)的接口。
  • 工作机制
    • 通过 JNI(Java Native Interface)调用本地方法。
    • 实现与底层操作系统和硬件的交互,如文件系统、网络操作。

5. JVM 内存模型(Java Memory Model, JMM)

  • 作用:定义线程如何交互以及如何访问内存。
  • 主要内容
    • 主内存(Main Memory):所有线程共享的内存区域。
    • 工作内存(Working Memory):每个线程独立的内存区域,用于存储线程私有的数据。
    • 可见性:规定线程对共享变量的修改如何被其他线程看到。
    • 原子性:确保基本操作的不可分割性。
    • 有序性:保证程序的执行顺序符合预期。

6. JVM 垃圾回收子系统

  • 作用:自动管理内存,回收不再使用的对象。
  • 常用算法
    • 标记-清除算法。
    • 标记-压缩算法。
    • 复制算法。
    • 分代收集算法。
  • 常见垃圾回收器
    • Serial GC、Parallel GC、CMS、G1 GC、ZGC、Shenandoah 等。

JVM 的工作原理

  1. 加载类:通过类加载子系统加载 .class 文件。
  2. 分配内存:在堆、栈等区域分配对象和方法的内存。
  3. 执行字节码:通过执行引擎逐条解释或即时编译代码并运行。
  4. 垃圾回收:定期清理无用的对象,释放内存。

总结

JVM 的组成模块紧密协作,为 Java 程序提供了一个高效、安全、跨平台的运行环境。每个部分都有其特定功能,共同构成了完整的 JVM。

JVM 的组成的更多相关文章

  1. 46张PPT讲述JVM体系结构、GC算法和调优

    本PPT从JVM体系结构概述.GC算法.Hotspot内存管理.Hotspot垃圾回收器.调优和监控工具六大方面进行讲述.(内嵌iframe,建议使用电脑浏览) 好东西当然要分享,PPT已上传可供下载 ...

  2. java 利用ManagementFactory获取jvm,os的一些信息--转

    原文地址:http://blog.csdn.net/dream_broken/article/details/49759043 想了解下某个Java项目的运行时jvm的情况,可以使用一些监控工具,比如 ...

  3. Jvm 内存浅析 及 GC个人学习总结

    从诞生至今,20多年过去,Java至今仍是使用最为广泛的语言.这仰赖于Java提供的各种技术和特性,让开发人员能优雅的编写高效的程序.今天我们就来说说Java的一项基本但非常重要的技术内存管理 了解C ...

  4. JVM类加载

    JVM的类加载机制就是:JVM把描述类的class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被JVM直接使用的Java类型 ClassLoader JVM中的ClassLoade ...

  5. Java虚拟机 JVM

    finalize();(不建议使用,代价高,不确定性大) 如果你在一个类中覆写了finalize()方法, 那么你可以在第一次被GC的时候,挽救一个你想挽救的对象,让其不被回收,但只能挽救一次. GC ...

  6. 在 Linux 中安装 Oracle JDK 8 以及 JVM 的类加载机制

    参考资料 该文中的内容来源于 Oracle 的官方文档 Java SE Tools Reference .Oracle 在 Java 方面的文档是非常完善的.对 Java 8 感兴趣的朋友,可以直接找 ...

  7. MapReduce剖析笔记之六:TaskTracker初始化任务并启动JVM过程

    在上面一节我们分析了JobTracker调用JobQueueTaskScheduler进行任务分配,JobQueueTaskScheduler又调用JobInProgress按照一定顺序查找任务的流程 ...

  8. java太low,又舍不得jvm平台的丰富资源?试试kotlin吧(一)

    尝试kotlin的起因 因为各种原因(版权,人员招聘),公司的技术体系从c#转到了java,我花了大概两周的时间来上手java,发现java的语法还是非常简单的,基本看着代码就知道什么意思.学习jav ...

  9. Jvm --- 常用工具

    jps:虚拟机进程状况工具 JVM Process Status Tool. 可以列出所有目前正在运行虚拟机的进程. jps -l 详细参数: -q 输出LVMID,省略主类名称 -m 输出虚拟机进程 ...

  10. JVM虚拟机结构

    JVM的主要结构如下图所示,图片引用自舒の随想日记. 方法区和堆由所有线程共享,其他区域都是线程私有的 程序计数器(Program Counter Register) 类似于PC寄存器,是一块较小的内 ...

随机推荐

  1. Pebbles pg walkthrough Easy

    NMAP ┌──(root㉿kali)-[/home/ftpuserr] └─# nmap -p- -A -sS 192.168.239.52 Starting Nmap 7.95 ( https:/ ...

  2. Apex pg walkthrough Intermediate

    nmap扫描 ┌──(root㉿kali)-[~] └─# nmap -p- -A 192.168.157.145 Starting Nmap 7.94SVN ( https://nmap.org ) ...

  3. 萌新赛 sprintf漏洞

    首先是个.git源码源码泄露,用githack回复一下源码 源码 <?php $pass=sprintf("and pass='%s'",addslashes($_GET[' ...

  4. Linux查看当前Cuda(CUDA Toolkit )版本

    纯转载. cat /usr/local/cuda/version.txt nvcc-V nvidia-smi查看的不是当前cuda版本,而是最高支持的cuda版本 https://blog.csdn. ...

  5. C语言这种单细胞编程语言和指针的一些理解

    转行做嵌入式也有一段时间了,原来做c#以及一些其它的上层语言, 本想的是也就是仅仅是语法上有点不一样.但是实际使用的切身体会真的是只有自己才知道.很多方面刷新了我对c语言以及计算机结构体系的认知 ,绝 ...

  6. 载誉而归!天翼云荣获第23届中国IT用户满意度大会多项殊荣

    10月25日,2024第23届中国IT用户满意度大会暨首届工业产品满意度交流会在北京举行.现场揭晓"2024中国IT用户满意度征集结果",天翼云凭借领先的产品技术.完善的客户服务以 ...

  7. cgroup与systemd: 通过src rpm获取systemd源代码,添加日志并使用rpmbuild重新打包

    问题起源 服务跑在富容器中.容器使用init进程作为一号进程,然后用systemd管理所有service. 在做一次升级时,nginx启动脚本有更新,原来是root拉起,现在进行了去root改造,使用 ...

  8. mybatis - [08] mybatis-config.xml 详解

    mybatis-config.xml中的标签需要按照一定顺序配置,否则会有以下提示. configuration(配置) properties(属性) settings(设置) typeAliases ...

  9. Linux - Centos操作系统iso文件下载

    CENTOS VERSION DOWNLOAD LINK CentOS 8.5(2111) Download CentOS 8.4(2105) Download CentOS 8.3(2011) Do ...

  10. 基于Maxmspjitter的基础【pixel shader】绘制模板Patcher

    间断性接触Maxmspjitter已经有6个年头了,是时候总结一些常用的.基础的知识以及它的应用,不过笔者自认为还是处于初学者阶段,望高人多多指教. 开始 这一次就以jitter模块中通用处理图像节点 ...