JVM虚拟机讲解,底层原理与性能优化关键点是什么?

JVM的底层本质是一台运行在操作系统之上的抽象计算机,它负责把字节码翻译成机器指令并管理内存;性能优化的关键,不是堆内存越大越好,而是让垃圾回收节奏与业务特征匹配。

JVM 像一位带着行李自己旅行的大管家,Java 代码经过编译变成 .class 字节码,自身无法被操作系统直接执行,JVM 就把字节码逐条解释、编译成当前系统的机器码,同时负责分配内存、回收垃圾、协调线程,理解了它在干什么,你就理解了 JVM 调优为什么那么多人头疼,因为它实际上是在管理两个东西:内存和线程。

黑马程序员JVM完整教程,Java虚拟机快速入门,全程干货不拖沓
加载中
黑马程序员JVM完整教程,Java虚拟机快速入门,全程干货不拖沓
146.3万1.6万3.7万
原视频地址

JVM内存模型详解与运行时数据区是怎么分工的

JVM 运行时把内存划分成几个区域,各管各的活,这套划分规则在 Oracle 官方文档里有明确定义,业内统称为“内存模型”,面试和工作中聊的“JVM内存模型详解”,99% 是在讲下面这些区域的分工。

堆区:对象的大本营

堆区是所有对象实例和数组的居住地,这块内存是所有线程共享的,也是垃圾回收的主战场,堆内部会进一步划分为年轻代和老年代,年轻代又分为 Eden 区和两块幸存者区。

绝大多数新建对象先进入 Eden 区,经过一轮垃圾回收后仍然存活的对象,会被移动到幸存者区,幸存者区的对象经过多次回收仍然存活,最后晋升到老年代。这个晋升过程依赖年龄计数器,每熬过一次回收年龄加一,超过阈值就能晋级。

关于堆的默认大小,行业共识是逻辑内存的四分之一作为上限,但这个数值并不适合所有业务,后面性能优化部分我会重点展开。

栈区:方法执行的临时舞台

栈区是线程私有的,每个线程启动时,JVM 都会为他分配一块栈空间,每当执行一个方法,JVM 就压入一个栈帧,栈帧里存放局部变量、操作数栈、动态链接和方法出口。

栈的生命周期跟方法绑定,方法执行完毕,栈帧自动弹出,无需垃圾回收器介入,所以局部变量用完就销毁,效率比堆高得多,不过如果方法递归调用深度过大,就会出现 StackOverflowError,这是栈空间耗尽的信号。

元空间与直接内存

JDK 8 以前,类元数据存储在永久代;JDK 8 之后,永久代被元空间取代,元空间不在 JVM 堆内,而是使用了操作系统直接内存,类信息、常量池、方法描述符都放在这里。

直接内存也叫堆外内存,NIO 类库可以通过 DirectByteBuffer 直接使用它,Java 的 netty、kafka 客户端大多采用堆外内存做数据缓冲,减少一次拷贝,这个区域如果使用不当也会撑爆,排查的时候别只盯着堆。

JVM虚拟机讲解,底层原理与性能优化关键点是什么?

JVM垃圾回收器怎么选:从 Serial 到 ZGC 的对比

JDK 究竟自带多少种垃圾回收器?答案是一套演进谱系,垃圾回收器选择,在相当大程度上决定了你的停顿时间。

分代回收器的阵营

JVM 早期使用分代收集器,包括 Serial 单线程回收器、Parallel 并行回收器和 CMS 并发标记清除回收器。

  • Serial:单线程回收,适合单核环境或小应用。
  • Parallel:多线程并行回收,吞吐量优先,适合批量计算和后台任务。
  • CMS:以最短停顿为目标,但会产生碎片,JDK 14 已被官方移除。

JDK 9 之后,G1 成为默认回收器,G1 把堆划分成多个相等区域,每次回收一部分区域的垃圾,而不是全堆扫描,它设计目标是在停顿可控的同时兼顾吞吐量,多数 Java 服务跑在 G1 上。

JDK 15 之后,ZGC 正式转正,ZGC 支持 TB 级堆,停顿时间几乎不随堆变大而增加,但代价是更耗 CPU。

不同回收器使用场景对比

回收器 核心思想 适合业务 代价
Serial 单线程串行 桌面端、极小堆 停顿较长
Parallel 多线程并行 离线计算、日志分析 停顿较长
CMS 并发标记清除 旧系统兼容遗留场景 碎片化,已移除
G1 区域化分代 大多数线上 Java 服务 大堆下停顿随堆增长
ZGC 并发引用染色 大堆、超低延迟场景 CPU 开销较高

选型建议

行业共识是:默认 G1 是一般服务的最优解,别急着换,如果业务要求极端低延迟且堆内存较大,再考虑 ZGC,小内存应用用 Serial 反而更省资源。

JVM性能优化关键点:从参数到大盘观测

性能优化不是调一个参数就完事,而是先观测,再定位,最后才调整参数,下面这套流程覆盖 Java 线上 JVM 优化的高频操作路径。

调整堆大小:先看实际占用

很多人喜欢把堆直接设置成很大的数值,效果往往适得其反,堆太大,垃圾回收单次时间长;堆太小,频繁触发 Full GC,CPU 白忙活。

合理做法是先在负载测试环境开启 GC 日志:

java -Xlog:gc:gc.log

JVM虚拟机讲解,底层原理与性能优化关键点是什么?

跑几天业务后,观察 GC 日志里堆实际使用峰值,然后设置:

-Xms4g -Xmx4g

将初始堆和最大堆设为一致,避免运行期动态扩容带来的性能抖动。这个是 JVM 调优最佳实践里最基础的一步。

Java线上OOM怎么排查:三步定位法

线上发生 OutOfMemoryError,很多团队第一反应是重启大法,但重启之后还会复现,不如按这套流程走:

  1. 启动时加上堆转储参数,让 JVM 在 OOM 时自动保存现场:
    -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/dump
  2. 使用 jmap 手动导出现存堆快照:
    jmap -dump:format=b,file=heap.hprof <pid>
  3. 用 MAT 或 VisualVM 分析直方图,查看哪个对象实例数量最多、哪个类占用的 Retained Heap 最大。

定位到对象后,多数情况是因为集合类缓存无限增长,或 SQL 取数没有分页,修复代码,比调大堆更有效。

CPU 飙高的排查命令

CPU 使用率居高不下,常见原因有两个:频繁 Full GC 和业务线程死循环。

  • 先用 top -Hp <pid> 找出CPU最高的线程 ID。
  • 将线程 ID 转成十六进制:printf '%xn' <tid>。
  • 执行 jstack <pid> > thread.log,在线程快照里搜索十六进制数字对应的线程栈。

这个时候你能看到它到底卡在哪段代码里,如果是 GC 线程占据大量 CPU,那要回去看 GC 日志;如果落在业务方法上,那就是代码逻辑问题。

参数优化四板斧

JVM 参数成百上千,但调优只围绕几个核心点:

  • 堆大小:-Xms 和 -Xmx 保持一致。
  • 元空间上限:设置 -XX:MaxMetaspaceSize,防止类加载器泄漏导致换机。
  • GC 日志开关:-Xlog:gc 记录详情。
  • OOM 自动转储:-XX:+HeapDumpOnOutOfMemoryError。

对于 G1 回收器,还可以设置 -XX:MaxGCPauseMillis 给出停顿目标,但别设置过小,否则 G1 会为了迎合目标而频繁回收,反而拉低吞吐量。

三个容易踩的坑

  • 盲目复制网上“无敌参数模板”,不经过压测直接上生产,容易出大事。
  • 频繁调优堆大小而不是修复代码问题,堆只是容器,代码里的对象持有才是根因。
  • 忽略堆外内存,DirectByteBuffer 使用过多会直接抛 OOM,但堆转储文件里却看不到多少对象。
  • JVM虚拟机讲解,底层原理与性能优化关键点是什么?

JVM性能优化常见参数有哪些:一句话讲清关键参数

JVM 面试里,JVM性能优化常见参数有哪些”这个问题其实问的是基本功,把下面这张参数表记牢,基本就能应付绝大多数场景:

  • -Xms:初始堆大小。
  • -Xmx:最大堆大小。
  • -Xmn:年轻代大小,过大则老年代变小。
  • -XX:MaxMetaspaceSize:类元数据上限。
  • -XX:+UseG1GC:显式启用 G1。
  • -XX:MaxGCPauseMillis:最大 GC 停顿目标。
  • -XX:ParallelGCThreads:并行 GC 线程数。
  • -XX:ConcGCThreads:并发标记线程数。

设置参数时,务必跟踪到底层原理。-Xmn 设置过大,年轻代对象晋升到老年代的机会变少,短期内频繁 Young GC 反而降低整体性能,任何参数调整后都要用 jstat 观察:

jstat -gcutil <pid> 1000 10

这个命令每秒输出一次各代内存使用率和 GC 耗时,连续输出 10 次,基本能判断出参数调整是否起了效果。

关于JVM知识的高频疑问解答

从堆内存角度,JVM内存模型和Java内存模型有区别吗?

有本质区别,JVM内存模型描述的是运行时数据区的划分,也就是前面提到的堆、栈、方法区等具体内存区域,而 Java 内存模型是围绕着多线程并发场景定义的一套抽象规则,解决的是可见性、有序性和原子性问题,对应 synchronized、volatile 这些关键字背后的语义,前者讲数据放哪里,后者讲多线程读写数据时怎么保证正确性。

线上 JVM 堆内存一直偏高但没到最大值,需要人为干预吗?

多数情况下不需要立即干预,先执行 jstat -gcutil <pid> 观察老年代使用率和 Full GC 频率,如果老年代占比持续上升且一直没有回落到安全水位,说明存在对象长期无法回收的可能,这时候再配合 jmap -dump 检查是否有对象意外持有大集合,优先处理代码层面的持有关系,而不是增加堆大小。

JDK 21 里 G1 和 ZGC 怎么选?

JDK 21 中 G1 仍是默认垃圾回收器,ZGC 从实验状态转正之后已经经过多个版本迭代,在低延迟方向上表现稳定,如果你的服务堆内存较小且追求最大吞吐量,继续用 G1;如果堆内存超过几十 GB,并且业务要求极端响应速度,ZGC 带来的停顿优势优于吞吐量的轻微下降,选择核心在于衡量你的业务到底缺停顿时间,还是缺 CPU 余量。

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://idctop.com/article/615173.html

赞 (0)
备用DNS服务器地址在哪设置?详细步骤是怎样的?
上一篇 2026年9月1日 17:11
域名中子域名为什么用点号来分隔?子域名怎么设置有何作用?
下一篇 2026年9月1日 17:11

相关推荐

  • 申请一级域名网站流程复杂吗?如何注册一级域名

    选定符合业务属性的顶级域名后缀,通过ICANN认证的注册商完成实名核验与支付,随后配置DNS解析并接入服务器,整个过程通常需1-3个工作日完成备案及生效,很多新手在搭建网站时,容易把“买域名”和“建网站”混为一谈,域名只是互联网的门牌号,而网站是门牌里的房子,要拥有一个属于自己的独立品牌资产,第一步就是搞定这个……

    2026年6月25日
    2900
  • HTML超链接提示文字怎么设置?html a标签title属性用法

    HTML超链接提示文字(title属性)是提升用户体验与搜索引擎抓取效率的关键细节,正确配置不仅能优化鼠标悬停体验,还能增强页面语义权重,在网页开发的日常实践中,许多开发者往往忽略了超链接中一个看似微小却至关重要的属性——title,这个属性通常被称为“悬停提示”或“工具提示”,当用户将鼠标指针停留在链接上时……

    2026年6月5日
    3600
  • 服务器线路不好延迟高怎么办?如何有效降低服务器延迟?

    面对服务器线路不好导致的高延迟问题,最直接有效的核心结论是:优选线路方案与架构优化双管齐下,通过引入智能BGP多线接入、部署CDN节点加速或切换至专线网络,从根本上解决网络拥堵与绕路问题,而非单纯依赖本地硬件升级, 解决这一问题的关键在于精准诊断病因,对症下药,结合专业服务商的技术支持,实现数据传输路径的最短化……

    2026年3月5日
    11400
  • TeamViewer局域网连接失败怎么办?TeamViewer内网穿透设置教程

    TeamViewer默认通过云端中继连接,但通过配置端口转发和启用“局域网直连”功能,可实现设备间的高速、低延迟远程访问,且完全免费,在IT运维和企业协作场景中,远程连接的稳定性与速度往往决定了工作效率的上限,许多用户在使用TeamViewer时,常因网络波动导致连接卡顿,或者因为跨国访问产生的高额费用而苦恼……

    2026年6月20日
    2400
  • 香港高防服务器国际带宽够用吗?香港高防服务器带宽怎么选

    香港高防服务器国际带宽完全够用,关键在于根据业务规模精准匹配带宽类型与防御策略,而非盲目追求大带宽数值,很多站长在搭建跨境业务时,往往陷入一个误区:认为带宽越大越好,或者觉得香港服务器因为地理位置特殊,国际访问速度一定慢,随着2026年网络基础设施的迭代,香港作为亚洲互联网枢纽的地位并未动摇,但其带宽的“够用……

    2026年6月17日
    2010
  • 北京服务器租用的预算表怎么做,新项目的费用项怎么列

    北京服务器租用预算表的核心在于明确配置需求、带宽峰值、IP数量以及机房等级,新项目还需加入测试环境和初期部署费用, 很多团队在规划时只盯着月租费,忽略了带宽超额、IP追加、异地备份等隐性成本,导致项目上线后费用超标,一张完整的预算表应该覆盖所有费用项,并预留弹性空间,下面我从费用项拆解到预算表制作,一步步带你把……

    2026年8月11日
    900
  • SSL证书怎么选?购买DV OV EV证书区别是什么

    SSL证书并非越贵越好,选择的关键在于匹配业务场景:个人博客选免费DV证书,企业官网需OV或EV证书以建立信任,而涉及在线支付的高敏感平台必须部署带有通配符或SAN多域名功能的OV/EV证书,并优先选择支持国密算法且具备本地化售后支持的国内CA机构,SSL证书类型深度解析与选型逻辑在决定购买之前,首先要厘清证书……

    2026年6月18日
    3000
  • IDC机房异地容灾建设怎么做?异地容灾建设方案有哪些

    IDC机房异地容灾建设的核心在于构建“两地三中心”或“多地多中心”架构,通过数据异步复制与业务自动切换机制,确保在极端灾难下数据零丢失且业务快速恢复,其综合成本通常比传统备份高出30%-50%,但能规避业务中断带来的巨大隐性损失,为什么传统备份无法替代异地容灾很多企业在规划IT架构时,容易混淆“数据备份”与“业……

    2026年6月16日
    2300
  • 宝塔Windows面板怎么用?宝塔面板安装网站教程

    宝塔Windows面板通过图形化界面简化了服务器管理,适合新手快速搭建网站,但相比Linux版本,其在Windows环境下的资源占用略高,建议配置4GB以上内存以保障流畅运行,对于许多刚接触服务器管理的站长来说,面对黑漆漆的命令提示符往往感到无从下手,宝塔Windows面板的出现,正是为了解决这一痛点,它像一位……

    2026年6月22日
    1510
  • FlyingPress缓存插件怎么安装更新?WordPress网站加速优化

    安装FlyingPress缓存插件需先在WordPress后台搜索并启用,更新时直接点击插件页面的“更新”按钮即可,该插件通过静态化页面显著提升加载速度,是提升网站SEO表现的高效工具,在WordPress生态中,页面加载速度直接关乎用户留存与搜索引擎排名,FlyingPress作为一款新兴的全栈缓存解决方案……

    2026年6月25日
    1900

发表回复

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