完整教程:Java核心 之JVM

news/2025/9/30 21:19:00/文章来源:https://www.cnblogs.com/tlnshuju/p/19121787

完整教程:Java核心 之JVM

2025-09-30 21:13  tlnshuju  阅读(0)  评论(0)    收藏  举报

JVM(Java Virtual Machine,Java 虚拟机)是 Java 语言跨平台特性的核心,它负责将字节码(.class 文件)解释或编译为机器码并执行。以下从核心角度详解 JVM:

一、JVM 的作用与地位

  1. 跨平台基石:"一次编写,到处运行"(Write Once, Run Anywhere)的实现者,通过屏蔽不同操作系统的底层差异,使字节码在任何安装了 JVM 的平台上运行。
  2. 内存管理:自动负责内存分配与回收(垃圾回收),减少手动内存操作的风险。
  3. 执行引擎:将字节码转换为机器码(解释执行或即时编译 JIT)。

二、JVM 内存结构(基于 Java 8 及以后)

JVM 内存分为线程私有线程共享两大区域:

1. 线程私有区域(随线程创建 / 销毁)
  • 程序计数器(Program Counter Register)记录当前线程执行的字节码指令地址(如分支、循环、跳转等),是唯一不会 OOM 的区域。

  • 虚拟机栈(VM Stack)存储方法调用的栈帧(Stack Frame),每个栈帧包含:

    • 局部变量表(方法内变量)
    • 操作数栈(计算过程的临时信息)
    • 动态链接(指向常量池的引用)
    • 途径返回地址可能抛出StackOverflowError(栈深度溢出)、OutOfMemoryError(栈扩展失败)。
  • 本地方法栈(Native Method Stack)类似虚拟机栈,但为 Native 方法(如 C/C++ 实现的手段)服务,HotSpot 将其与虚拟机栈合并完成。

2. 线程共享区域(随 JVM 启动 / 关闭)
  • 堆(Heap)

    • JVM 中最大的内存区域,所有对象实例及数组均在此分配。
    • 是垃圾回收(GC)的重要区域,可分为:
      • 新生代(Eden 区 + 两个 Survivor 区,比例通常 8:1:1)
      • 老年代(存放存活久的对象)可能抛出OutOfMemoryError: Java heap space
  • 方法区(Method Area)

    • 存储类信息(结构、方法、字段)、常量、静态变量、即时编译后的代码等。
    • Java 8 后由元空间(Metaspace)搭建,取代永久代,元空间利用本地内存,默认无上限(可配置)。可能抛出OutOfMemoryError: Metaspace(元空间不足)。
  • 运行时常量池(Runtime Constant Pool)

    • 方式区的一部分,存放类加载时从字节码常量池解析出的字面量(如字符串)和符号引用(如类名、方法名)。
    • 字符串常量池(String Pool)是其重要组成,JDK 7 后移至堆中。

三、类加载机制

JVM 将.class 文件加载到内存并生成可执行代码的过程,分为 5 步:

  1. 加载(Loading)通过类全限定名(如java.lang.String)获取二进制字节流,将其转换为方法区的运行时数据结构,并在堆中生成Class对象作为访问入口。

  2. 验证(Verification)确保字节码符合 JVM 规范(如格式正确、安全校验),防止恶意字节码攻击。

  3. 准备(Preparation)为类的静态变量分配内存并设置初始默认值(如int为 0,boolean为 false),不包含初始化语句(如static int a = 10中的 10 在初始化阶段赋值)。

  4. 解析(Resolution)将常量池中的符号引用(如类名、方法名)替换为直接引用(内存地址)。

  5. 初始化(Initialization)执行类构造器<clinit>()方法:

    • 合并静态变量赋值语句和静态代码块(按顺序执行)。
    • 父类<clinit>()先于子类执行。

四、垃圾回收(GC)

JVM 自动回收不再被引用的对象内存,核心步骤:

1. 如何判断对象可回收?
  • 引用计数法:对象被引用时计数 + 1,失效时 - 1,计数为 0 则可回收(缺点:无法处理循环引用)。
  • 可达性分析:以 "GC Roots" 为起点(如虚拟机栈引用的对象、静态变量、常量等),不可达的对象标记为可回收。
2. 垃圾回收算法
  • 标记 - 清除(Mark-Sweep):标记可回收对象后直接清除(缺点:产生内存碎片)。
  • 标记 - 复制(Mark-Copy):将存活对象复制到新区域,清除原区域(适合新生代,如 Eden 区到 Survivor 区)。
  • 标记 - 整理(Mark-Compact):标记后将存活对象向一端移动,再清除边界外内存(适合老年代)。
3. 常见垃圾收集器
  • SerialGC:单线程 GC,适用于简单应用(Client 模式)。
  • ParallelGC:多线程 GC,注重吞吐量(吞吐量 = 运行用户代码时间 / 总时间)。
  • CMS(Concurrent Mark Sweep):并发标记清除,注重低延迟(停顿时间短)。
  • G1(Garbage-First):将堆分为多个 Region,优先回收垃圾多的区域,平衡吞吐量和延迟(Java 9 后默认)。
  • ZGC/Shenandoah:超低延迟 GC(毫秒级以下),适合大内存场景。

五、执行引擎

将字节码转换为机器码的核心组件:

  1. 解释器:逐行解释字节码为机器码,启动快但执行慢。
  2. JIT 编译器(即时编译器):将热点代码(频繁执行的代码)编译为本地机器码缓存,提高执行效率(HotSpot 的 C1 编译器针对客户端,C2 针对服务端)。
  3. 混合模式:JVM 默认采用解释 + JIT 编译结合的方式,兼顾启动速度和执行效率。

六、JVM 参数调优

依据 JVM 参数安装内存大小、GC 策略等,常见参数:

  • 堆内存:-Xms(初始堆大小)、-Xmx(最大堆大小,建议与-Xms一致避免频繁扩容)。
  • 新生代:-Xmn(新生代大小)、-XX:SurvivorRatio=8(Eden 与 Survivor 比例)。
  • 元空间:-XX:MetaspaceSize-XX:MaxMetaspaceSize
  • GC 日志:-XX:+PrintGCDetails-XX:+PrintGCTimeStamps(分析 GC 问题)。
  • 垃圾收集器:-XX:+UseG1GC(使用 G1)、-XX:+UseZGC(使用 ZGC)。

总结

JVM 是 Java 生态的核心,其内存管理、类加载、垃圾回收和执行引擎共同支撑了 Java 的跨平台性和安全性。理解 JVM 原理不仅有助于排查内存泄漏、OOM 等问题,也是高性能 Java 应用调优的基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/923258.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何查询网站备案信息查询如何注册公司营业执照

使用rm -rf命令转载于:https://www.cnblogs.com/dyh-air/p/7726611.html

如何查询网站的注册信息黄骗免费网站

文章目录 1.计算机网络的功能:2.计算机网络的分类:3.主机间的通信方式:4.电报交换、报文交换、分组交换的区别:5.计算机网络的性能指标:6.0SI模型和TCP/IP模型:7.通信信通的方式:8.端到端的通信与点到点通信的区别:9.同步通信和异步通信:10.频分复用、时分复用、波分复用和码分…

9.30 闲话

never be back,but i am back于是我越来越念旧 czh: 不出意外的话,这应该是我的最后一舞了,之后 OI 可能就只是当做消遣了。已经初四,感觉继续冲 OI 希望已经不大,更何况在强省,又何况同校的同级的也比我强很多。…

哈尔滨建站模板搭建中铁建设登录入口

在.NET Core中实现Docker一键部署&#xff0c;通常涉及以下几个步骤&#xff1a;编写Dockerfile以定义镜像构建过程、构建Docker镜像、运行Docker容器&#xff0c;以及&#xff08;可选地&#xff09;使用自动化工具如Docker Compose或CI/CD工具进行一键部署。以下是一个详细的…

C语言⽂件管理讲解(1)

C语言⽂件管理讲解(1)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &qu…

前沿的设计网站做百度收录的网站

T2I Adapter是一款轻量级适配器&#xff0c;用于控制文本到图像模型并为其提供更准确的结构指导。它通过学习文本到图像模型的内部知识与外部控制信号&#xff08;如边缘检测或深度估计&#xff09;之间的对齐来工作。 T2I Adapter的设计很简单&#xff0c;条件被传递到四个特征…

深圳商城网站设计费用近一周的热点新闻

比我想象得要简单&#xff0c;看到了这里的讨论&#xff1a; v2ray是否可以局域网共享&#xff1f; Issue #210 v2ray/v2ray-core GitHub 这个博客就简单记录一下。相信有需求的朋友不止我一个。

长春行业网站男女做暧昧试看网站

新质生产力是未来几年着重发展的方向&#xff0c;关于如何实现产业化升级&#xff0c;各厂家会在自身的基础上进行产业化调整升级&#xff0c;利用新工具、新手段&#xff0c;大幅缩短研发设计周期&#xff0c;从而让产品迭代速度不断加快&#xff1b;提升产品品质&#xff0c;…

Min-p采样:通过动态调整截断阈值让大模型文本生成兼顾创造力与逻辑性

大语言模型的工作原理说起来很直接:根据输入内容和已生成的文本,预测下一个最合适的词(token)。输入先转换成 token,再变成向量表示,最后在输出层重新转回 token。 真正的挑战在于如何从候选词中做出选择。这个过…

2025 年快速卷帘门品牌最新推荐排行榜:聚焦智能定制与高效供货,精选快速卷帘门实力厂家

如今,快速卷帘门已成为工业生产、物流仓储、商业运营等领域保障通行效率与环境稳定的核心设备,市场需求持续增长。但当前市场品牌鱼龙混杂,部分厂家为降低成本,采用劣质材料与简化工艺,导致产品故障率高、维护成本…

ARL灯塔搭建

灯塔是一个综合性的资产探测工具,由于年代过于久远缺乏维护导致环境配置起来经常会报一些莫名奇妙的错误(哭)#自动化-综合架构-ARL&Nemo ARL灯塔 项目地址:https://github.com/TophantTechnology/ARL 介绍: 旨…

记 Charles 抓不到包 - Higurashi

发现是因为没有配置好 SSL 代理,打开Proxying->SSL proxying settings:应该如下配置:参考:Charles 抓包抓不到数据

贼猴 0930 模拟赛 T2 | 计数

没有传送门。 非常有意思的一道题,都是独立想出来的。 题意 维护一个序列,支持单点修改,查询全局所有长度为 \(k\) 的区间,区间中不同数字个数的和。 序列长度 \(n\),操作次数 \(m\),满足 \(n, k, m \leq 3 \tim…

STM32H743-ARM例程13-SDIO - 实践

STM32H743-ARM例程13-SDIO - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&q…

珠海自助建站软件网站后台程序和数据库开发

现在做的是RK平台的I2C驱动,不是说linux每个外设对应一个设备文件吗?可是找了一下一直没找到,今天特别搞了一下。I2C设备是注册为platform平台驱动的。 下面是我用adb命令查看的 linux的设备文件不一定只在dev/这个目录下面,像sys/ 目录下面也会有一些设备文件的 MID下面…

unibest + uView Plus+VSCode

Node下18+VSCode 插件:uni-app-snippets Vue (Official) Vue 3 Snippets ESLint Prettier - Code formatter Path Intellisense JSON5 syntaxpnpm create unibest@latest 项目名称:wejiaui 选择模板:base-uview-pro…

企石网站建设公司制作网页一般需要兼容哪些网站

目录 1、F12 2、robots 3、game1-喂青蛙 4、game 2 - flap bird 5、game 3 - Clash 6、Get&Post 7、sql &#xff08;1&#xff09;手工注入 &#xff08;2&#xff09;工具注入 8、命令执行漏洞 9、文件上传漏洞 10、文件泄露 11、php反序列化漏洞 12、PHP绕…

详细介绍:学科竞赛管理系统|基于SpringBoot和Vue的学科竞赛管理系统(源码+数据库+文档)

详细介绍:学科竞赛管理系统|基于SpringBoot和Vue的学科竞赛管理系统(源码+数据库+文档)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important…

青岛建站seo公司无锡网站优化工作室

在 Flutter 开发中&#xff0c;加载本地 HTML 文件是一个常见的需求&#xff0c;尤其是在需要展示离线内容或自定义页面时。flutter_inappwebview 是一个功能强大的插件&#xff0c;支持加载本地文件和网络资源。本文将详细介绍如何使用 flutter_inappwebview 加载 App 本地 HT…