JVM虚拟机技术是什么,如何学习?

JVM虚拟机技术是Java应用稳定运行的基石,掌握其内存模型与调优方法,是解决线上性能问题和通过大厂面试的核心能力。

JVM(Java Virtual Machine)是一门“看着抽象、用着具体”的技术,很多开发者在写代码时感觉不到它的存在,但一旦遇到线上CPU飙升、接口频繁卡顿、系统频繁Full GC,才会意识到JVM知识储备的重要性,下文从内存结构、垃圾回收器选择、调优操作、故障排查四个维度展开,全程用实操逻辑说话。

这可能是B站讲的最好的JVM虚拟机实战教程,一周吃透JVM从入门到企业级实战:JVM内存模型+JVM底层原理+JVM调优实战+JVM面试题,让你少走99%弯路!
加载中
这可能是B站讲的最好的JVM虚拟机实战教程,一周吃透JVM从入门到企业级实战:JVM内存模型+JVM底层原理+JVM调优实战+JVM面试题,让你少走99%弯路!

先弄懂JVM的内存到底怎么划分

很多人背过JVM内存模型,但真正遇到问题还是不知道看哪里,行业共识认为,JVM内存分区就是一套“对象生产车间”的流水线布局,理解它,不需要啃晦涩的规范文档,只需要搞懂每个区域“装什么、满了会怎样、谁负责清理”。

堆内存是主角,也是故障高发地

堆是JVM管理的最大一块内存,几乎所有对象实例都在这里分配,堆内部又细分为新生代和老年代,其中新生代还分为Eden区、From Survivor区和To Survivor区。

  • 新生代:大部分短命对象在这里出生,Minor GC(新生代垃圾回收)会频繁在这里工作。
  • 老年代:挺过多轮Minor GC的“长寿对象”会晋升到这里,Major GC或Full GC主要清理这里。
  • 元空间(Metaspace):存储类元数据信息,取代了JDK8之前的永久代,它使用的是本地内存,默认情况下大小不受JVM堆内存限制。

接口报错 OutOfMemoryError: Java heap space 就是堆内存耗尽,最常见的原因是某个集合类无限增长,或者一次查询加载的数据量远超预期。

虚拟机栈与本地方法栈:线程的私有空间

每个线程创建时都会分配一个虚拟机栈,里面存放一个个栈帧,每个方法调用对应一个栈帧,栈帧里保存了局部变量表、操作数栈、动态链接和方法出口等信息,线程请求的栈深度超过最大值时,会抛出 StackOverflowError,常见于无限递归。

程序计数器:最小的内存区域

程序计数器是当前线程所执行字节码的行号指示器,它占用空间极小,且是JVM规范中唯一没有规定OutOfMemoryError情况的区域。

垃圾回收器选型:G1和CMS垃圾回收器对比

JVM提供多种垃圾回收器,选择逻辑不是“哪个新用哪个”,而是“哪个匹配自己的业务延迟诉求”,目前JDK11及更高版本中,G1已经是默认收集器,但在低延迟场景下,ZGC正在快速普及。

G1和CMS的核心差异

G1的设计目标是“在可预测的停顿时间内,尽量完成垃圾回收”,它把堆划分为多个大小相等的Region区域,通过维护一个优先级列表,优先回收价值最大的Region,CMS(Concurrent Mark Sweep)则是以“最短回收停顿时间”为目标的并发收集器,但它在JDK9后被标记为废弃。

JVM虚拟机技术是什么,如何学习?

对比维度

G1收集器CMS收集器
内存布局基于Region分区,逻辑分代物理分代,连续内存
回收算法复制算法+标记整理标记清除
停顿预测支持可预测停顿时间模型依赖并发线程,无法精确预测
碎片问题基本无碎片,Region间复制内存碎片较多,大对象分配受影响
适用场景堆内存较大(6GB以上)、多核CPUJDK8及以前、追求低停顿的小内存应用

CMS已经进入维护期,业内专家指出,还在用JDK8且堆内存超过8GB的场景,优先迁移到G1是比较理性的选择,迁移的成本主要在JVM参数调整,业务代码几乎不需要改动。

怎么判断当前使用的是哪个垃圾回收器

执行以下命令可以快速查看Java进程使用的收集器组合:

jcmd <pid> VM.flags | grep -i "UseG1GC|UseCMS|UseZGC"

JDK8默认使用ParallelGC(并行收集器),JDK11及以上默认启用G1,如果线上堆内存较大且频繁看到“Pause Full (Allocation Failure)”日志,说明GC压力已经很大,单纯调整堆大小已经不够,需要考虑更换收集器参数。

JVM调优参数怎么设置:别乱加,按场景来

JVM调优不是把网上流传的参数堆上去就行,参数之间讲究配合,调优的核心目标只有两个:一是降低Full GC频率,二是减少单次GC停顿时间,实际生产环境里,这两者往往是矛盾的,需要权衡。

堆内存大小设置策略

推荐使用 -Xms 和 -Xmx 设置相同值,避免堆大小在运行期动态伸缩带来的性能损耗,多数情况下,堆大小设置为系统物理内存的50%-70%比较合理,剩余内存留给操作系统缓存和元空间。

具体操作时,在启动脚本中加入:

java -Xms4g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -jar your-service.jar

上面的参数含义是:堆初始和最大均为4GB,使用G1收集器,目标停顿时间200毫秒,需要额外说明的是,MaxGCPauseMillis只是软目标,G1会尽力达成,不保证绝对精确。

元空间与线程栈的调整

对于频繁加载或动态生成类的应用(如Spring Boot、MyBatis、CGLIB代理),建议显式设置元空间上限,防止元数据泄漏拖垮系统:

-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m

线程栈大小使用默认值即可,除非有明确的递归深度需求,否则不建议修改 -Xss 参数,修改不当会直接导致线程创建失败。

JVM内存溢出怎么排查:从现象到根因

线上出现内存溢出,第一反应不能是重启,而是要留下现场证据,完整的排查链路分为四步:拿到堆转储文件、分析对象分布、定位代码位置、验证修复效果。

JVM虚拟机技术是什么,如何学习?

第一步:保留故障现场

启动参数里加上自动导出堆转储的配置:

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/logs/heapdump.hprof

这样JVM在抛出内存溢出错误时,会自动生成堆转储快照文件,如果没有加这个参数,可以用 jmap 手动导出,但操作需要谨慎,导出过程会暂停应用:

jmap -dump:format=b,file=/data/logs/heapdump-20260615.hprof <pid>

第二步:用MAT分析堆转储文件

打开Eclipse MAT(Memory Analyzer Tool),选择“Leak Suspects Report”,工具会自动找出最可疑的持有大对象的线程和对象,重点看三处:

  • Dominator Tree(支配树):找出占用堆内存最大的对象及其引用链。
  • Thread Details:查看哪个线程的栈帧中持有了大量对象。
  • 重复对象检测:排查是否存在同一个大对象被多份拷贝。

开发环境里排查JVM内存溢出,可以先用MAT这样的可视化工具定位问题类。

第三步:修复与验证

分析完成后,修复方向通常是内存泄漏或并发流量高峰的问题,一个批量导出功能将查询结果全部放入内存后再写文件,换成流式查询(使用游标方式每次取固定行数)即可解决。

验证修复效果时,建议压测环境模拟线上峰值流量,测试前记录Full GC频率和平均停顿时间,测试后对比数据。

JVM面试题及答案:这些考点经常被问

JVM是Java面试的必考板块,面试官不会直接问“什么是JVM”,而是从实战视角切入,以下三个问题属于高频中的高频。

解释一下JVM的类加载过程?

类加载分为加载、链接、初始化三个阶段,链接又细分为验证、准备、解析,加载阶段通过类的全限定名获取二进制字节流;验证阶段确保字节流符合JVM规范;准备阶段为静态变量分配内存并赋零值;解析阶段将符号引用替换为直接引用;初始化阶段执行静态代码块和赋值操作。

Full GC频繁怎么办?

优先用 jstat -gcutil 1000 观察各内存区域的变化趋势,如果老年代稳定增长且每次Full GC后回收效果不明显,基本判定为内存泄漏,如果老年代占用率居高不下但回收后有效,说明存活对象过多或堆容量偏小,前者需要代码层修复,后者需要调整堆大小或更换收集器。

什么是STW(Stop The World)?

STW是指垃圾回收过程中,JVM暂停所有业务线程的现象,几乎所有垃圾回收算法都会经历STW,只是停顿时长不同,G1通过并发标记和可预测停顿模型,尽量压缩STW时间,ZGC的STW时间则可以控制在1毫秒以内,支撑了TB级堆内存的应用场景。

JVM线上故障排查的常规武器

排查JVM问题需要依靠工具链,这些命令不一定每天用,但关键时刻能救命。

JVM虚拟机技术是什么,如何学习?

  • jps:列出当前机器上的Java进程,拿到PID。
  • jstat:监视JVM内存、GC、类加载的统计信息。
  • jstack:导出线程快照,排查死锁、线程阻塞、热点方法。
  • jmap:导出自定义堆转储文件,查看堆内存概要。
  • jcmd:JDK8及以上版本的整合工具,集合了多项VM操作功能。

举个例子,线上应用CPU飙到100%时,先用top定位进程PID,再执行top -Hp <pid>找到CPU占用最高的线程ID,将其转换为16进制后,用jstack <pid> | grep <十六进制线程ID>就能精确锁定对应的业务代码位置,这个排查链路是每一个Java服务端工程师的基本功。

JVM和Docker容器共存时的内存边界

现代部署模式普遍采用容器化,JVM在容器内的行为值得关注,运行在Docker环境下的Java应用,如果未显式设置堆大小,JVM可能识别不到容器内存上限,而是直接读取宿主机的CPU核数与内存大小,造成容器被系统Kill,解决办法是在启动命令中显式设置-Xmx,或者使用-XX:+UseContainerSupport(JDK10及以上默认开启)并结合-XX:MaxRAMPercentage来按比例分配:

java -XX:MaxRAMPercentage=70.0 -jar your-app.jar

这种方式让JVM自动感知容器内存限制,按比例分配堆内存,比硬编码堆大小更适配弹性伸缩的容器环境。

JVM常见问题

JVM调优参数怎么设置才能减少Full GC次数?

减少Full GC的根本是控制老年代对象的晋升速率,具体操作包括:调大新生代空间比例(比如-XX:SurvivorRatio=6),延长对象在新生代的存活时间;避免在循环中创建大对象;排查是否存在集合类持有无效引用,参数调整只是辅助手段,代码层面的对象生命周期管理才是根本解法。

G1收集器的Region大小怎么计算?

G1的Region大小由JVM根据堆内存自动推算,最小1MB,最大32MB,必须是2的幂次,当堆大小为4GB时,Region通常为2MB,不建议手动指定-XX:G1HeapRegionSize,让JVM按默认规则计算更可靠,手动指定不当会造成Region数量过多或过少,影响回收效率。

元空间内存溢出和堆内存溢出有什么本质区别?

堆内存溢出是对象实例过多导致的,元空间溢出是类元数据过多导致的,堆溢出多见于业务代码问题,元空间溢出常见于大量动态代理类生成、热部署场景未清理类加载器,排查元空间溢出时,关注点不在对象数量,而在于类加载器是否被正确卸载。

JVM虚拟机技术的学习路径不需要贪多求全,先把内存模型、垃圾回收、故障排查这三件事打通,再按需深入调优参数底层原理,真正理解JVM的开发者,拿到任何一台线上Java服务都能迅速定位问题,这份能力比记住任何参数都有价值。

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://idctop.com/jvm%e8%99%9a%e6%8b%9f%e6%9c%ba%e6%8a%80%e6%9c%af%e6%98%af%e4%bb%80%e4%b9%88%ef%bc%8c%e5%a6%82%e4%bd%95%e5%ad%a6%e4%b9%a0%ef%bc%9f/

赞 (0)
海康威视域名怎么注册,注册费用和流程是什么?
上一篇 2026年9月15日 10:52
政企合规整改中高防到底多重要,高防产品怎么选?
下一篇 2026年9月15日 10:52

相关推荐

  • 高级项目经理证书申请表怎么填?高级项目经理报考条件有哪些

    精准填报高级项目经理证书申请表是获取该项核心资质的唯一行政路径,需严格对标2026年新版评审标准与主管机构规范,确保业绩材料与学时证明的绝对合规,申请表核心逻辑与2026年评审新规政策风向与底层逻辑依据中国软件行业协会2026年最新修订的评审规范,高级项目经理的考核已从“纯论文导向”全面转向“交付实效与风控能力……

    2026年4月26日
    5600
  • 搭建个人云存储系统有哪些优势?自建私有云nas方案

    构建个人云存储系统的核心在于平衡数据安全性、访问速度与成本,建议采用“本地NAS+公有云备份”的混合架构,既享受私有数据的掌控感,又利用公有云的容灾能力,在数字化生活日益深入的今天,数据已经成为比金钱更宝贵的资产,从手机里的几千张照片到工作文档,再到家庭监控录像,这些数据散落在各个平台,既不安全也不可控,很多人……

    服务器运维 2026年5月27日
    5900
  • 服务器四大公司具体有哪些,哪家公司的产品性价比高

    服务器四大公司,通常指在IDC行业占据主导地位的中国电信、中国联通、中国移动以及世纪互联,但选择服务商时,比名气更重要的是资质、机房自营能力和长期服务口碑,这也是为什么像简米科技、酷番云这样的持牌专业服务商越来越多地被企业纳入考察范围,服务器四大公司的行业位次要理解服务器四大公司,必须先看国内IDC市场的格局……

    2026年8月2日
    1300
  • 服务器调试器是什么?服务器故障排查工具推荐

    服务器的调试器是一种专门用于诊断、分析和修复运行在服务器环境中的软件程序(包括操作系统内核、服务、守护进程、应用程序等)内部问题的专业工具,它允许开发者或系统管理员深入到程序的执行流程中,检查运行时的状态(如内存内容、寄存器值、变量值、调用堆栈),控制程序的执行(如单步执行、设置断点),从而精准定位代码逻辑错误……

    2026年2月11日
    10900
  • 服务器更新速度为什么慢,如何解决服务器更新慢的问题

    在数字化转型的浪潮中,服务器更新速度已成为决定企业在线业务竞争力的核心指标,它不仅直接影响用户体验和留存率,更是搜索引擎评估网站质量、赋予排名权重的关键因素,提升服务器更新速度本质上是一场对底层架构、网络传输及数据处理的综合优化,其核心结论在于:通过构建分层缓存体系、优化数据库查询效率以及利用边缘计算技术,可以……

    2026年2月17日
    19400
  • 服务器开放端口步骤,服务器如何开放端口?

    服务器开放端口的核心在于确保服务可达性的同时,维持系统最高级别的安全防护,正确的操作流程并非简单的“打开开关”,而是一个涉及防火墙配置、服务商策略调整、服务部署及安全验证的系统工程,任何环节的疏漏都可能导致服务不可用或引发严重的安全隐患,遵循标准化的操作规范至关重要, 前置准备:确认服务状态与端口需求在执行具体……

    2026年3月27日
    11200
  • 手游云顶有哪些服务器,哪个区的玩家最多?

    手游云顶(金铲铲之战/云顶之弈手游)的服务器主要分为两大类:一是腾讯官方在国内划分的微信区与QQ区(含各大区服),二是面向海外玩家及国际服用户的拳头游戏(Riot Games)直营服务器,若特指国内玩家常说的“哪个区人多、延迟低”,答案优先选择微信区艾欧尼亚或QQ区黑色玫瑰;若涉及网络优化或海外加速,则需关注I……

    2026年9月1日
    1000
  • 服务器过载保护如何正确设置?,常见问题有哪些?

    服务器过载保护的核心是通过限流、降级、熔断和弹性伸缩的组合策略,确保系统在流量高峰时仍能稳定响应核心请求,避免雪崩式崩溃,没有防护的服务器就像没有保险丝的电路,一旦电流超过额定值,整个系统就会烧毁,无论是电商大促的流量洪峰,还是恶意爬虫的突发请求,过载保护都是系统稳定性的最后一道防线,服务器过载保护怎么做:从检……

    2026年8月3日
    1000
  • 服务器开发文档怎么写?服务器开发流程详解

    服务器开发文档是构建高性能、高可用系统的基石,其核心价值在于将复杂的架构逻辑转化为可执行的工程规范,从而降低沟通成本、提升协作效率并保障系统的长期可维护性,一份优秀的开发文档不仅是技术实现的记录,更是团队技术资产沉淀与传承的关键载体,直接决定了项目从需求分析到上线运维的全生命周期质量,核心结论:文档驱动开发是提……

    2026年3月29日
    9800
  • Python培训机构怎么选?哪家Python培训机构好

    “Python 机构”这个概念比较宽泛,通常指的是提供 Python 编程培训、认证或相关服务的教育机构、公司或社区,为了给你更精准的建议,我将“Python 机构”分为以下几类,并附上选择建议:在线学习平台(适合自学、性价比高的用户)这些平台提供视频课程、实战项目和社区支持,适合大多数初学者和进阶者,Cour……

    2026年7月10日
    8700

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注