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

相关推荐

  • 广州ECS云服务器拒绝连接的原因,为什么云服务器突然连不上

    广州ECS云服务器出现“拒绝连接”的错误,本质上是网络请求未能到达目标服务进程,被操作系统防火墙、云平台安全策略或服务本身拦截所致,解决问题的关键在于按照“服务器自身配置—云平台安全管控—网络链路状态”的顺序进行逐层排查, 服务器内部安全策略拦截这是最常见的原因,占比超过50%,当请求到达服务器网卡,但操作系统……

    2026年3月31日
    9300
  • 服务器线路怎么选?BGP和CN2有什么区别?

    选择服务器线路的核心原则在于“业务场景匹配用户群体”,对于绝大多数追求速度与稳定的中国大陆用户而言,CN2线路是首选,其次是优质BGP线路,普通国际线路仅作预算兜底,如果您的业务面向全球且对互联互通要求极高,BGP线路则是最优解,在服务器线路怎么选?BGP和CN2区别这一关键问题上,决策的依据并非单纯的价格,而……

    2026年3月5日
    11700
  • 服务器价位和国际火车票的最新报价哪里查,怎么买最便宜?

    国际火车票预订平台的服务器成本是影响票价的重要因素,选择性价比高的云服务器能有效降低运营成本,从而提供更具竞争力的国际火车票价格,国际火车票价格与服务器成本的关系国际火车票的最终售价包含多项隐性成本,其中服务器相关支出常被忽视却占比可观,无论是自建预订系统还是使用第三方平台,服务器租赁、带宽、维护费用都会分摊到……

    2026年8月2日
    200
  • 虚拟机SSH连接断开如何修复?,远程访问怎么恢复

    虚拟机SSH连接突然断开,大概率是网络空闲超时、IP地址变动或sshd服务异常导致,最快恢复方式是先检查网络连通性,再重启ssh服务,最后确认IP是否变化,远程开发或者服务器运维时,最怕的就是敲代码敲到一半,终端突然卡住,然后提示连接关闭,那种感觉就像电话打着打着突然断线,你对着屏幕喊“喂喂喂”也没人应答,其实……

    2026年9月6日
    300
  • 广州bgp高防ip怎样清洗?高防IP清洗原理与配置方法

    广州BGP高防IP的清洗机制核心在于“精准引流、智能检测、多层过滤、极速回注”,通过部署在骨干节点的清洗中心,将恶意流量剥离,确保正常业务流量零中断,这一过程并非简单的“清洗”,而是一套融合了特征识别与行为分析的动态防御体系,其有效性直接决定了业务在高强度DDoS攻击下的生存能力, 流量牵引与智能调度:防御的起……

    2026年4月1日
    9400
  • 广州300g高防ddos服务器租用价格多少?高防服务器哪家好

    在广州地区部署高防业务,选择300G防御能力的服务器是目前中大型互联网业务对抗DDoS攻击的最佳“甜点区”,它能在成本与安全之间取得最优平衡,确保业务在遭受大规模流量攻击时仍能稳定运行,对于金融、游戏、电商等对连通性要求极高的行业而言,广州300g高防ddos服务器租用不仅是基础设施的投入,更是业务连续性的核心……

    2026年4月1日
    8500
  • IP地址能申请SSL证书吗,IP地址申请SSL证书教程

    IP地址本身可以申请SSL证书,但仅限于IP地址证书,且目前主流浏览器已逐步限制或弃用此类证书,强烈建议为域名申请标准的域名SSL证书,在构建网站安全体系时,许多开发者或站长会面临一个技术抉择:当服务器没有固定域名,或者为了测试方便直接使用IP访问时,能否通过IP地址获取HTTPS加密服务?答案是肯定的,但背后……

    2026年6月21日
    3410
  • 带宽峰值和带宽区别?带宽峰值和平均带宽有什么不同

    带宽通常指网络传输速率的稳定保障值,即“平均速度”或“额定速度”,而带宽峰值则是网络在极短时间内达到的最高速率极限,带宽决定了网络传输的“下限”和稳定性,带宽峰值则代表了网络的“上限”和爆发力, 在实际应用中,如果只关注峰值而忽视稳定带宽,极易导致网络拥堵、业务卡顿甚至服务中断,对于企业级用户而言,稳定带宽的价……

    2026年3月6日
    13100
  • VPS带宽和服务器带宽区别?云服务器带宽怎么选才合适

    VPS带宽与服务器带宽的本质差异在于资源的“共享”与“独享”,这直接决定了网络性能的稳定性与数据传输的可靠性,对于追求高性能业务的企业而言,物理服务器独享带宽是保障用户体验的基石,而VPS共享带宽则更适合初创期流量波动较小的项目,核心结论:独享与共享的性能鸿沟带宽决定了数据传输的“马路宽度”,决定了同一时间能容……

    2026年3月8日
    12400
  • WordPress在线教育LMS主题怎么选?哪些主题适合搭建网课平台

    2026年WordPress在线教育LMS学习管理系统首选主题推荐:LearnPress配合H5P互动插件或Tutor LMS配合Elementor构建,兼顾SEO友好与高转化率,在2026年的数字教育市场中,选择一款合适的WordPress LMS主题不再是简单的“选个模板”,而是构建整个教学商业闭环的基础设……

    2026年6月22日
    2000

发表回复

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