加载中

JVM

文章分类

浏览该分类下的所有文章

12 篇文章 1

一次OOM排查实录

项目在无预警日志截断后被系统强制终止,排查发现是 Linux OOM Killer 在 2 GB 机器上杀掉了 Java 进程。根因在于:未给 JVM 限制堆内存、MySQL 8.0 默认配置占用大量内存、且无 Swap 作为缓冲。通过为三个 Spring Boot 应用分别设定 -Xms/-Xmx(512 M、256 M 各),调低 MySQL 参数(innodb_buffer_pool_size、max_connections、performance_schema 等),并创建 2 GB Swap,显著降低内存占用并消除 OOM 触发。文章最后提醒:小内存环境必须限制 JVM、精简 MySQL 配置、配置 Swap,若业务继续增长应迁移数据库或升级机器。

JVM对象创建与内存分配机制

对象创建首先检查类是否已加载、解析、初始化;通过在堆中划分内存完成分配,常用“指针碰撞”和“空闲列表”两种方式,并通过CAS或TLAB(-XX:+UseTLAB)解决并发竞争。分配后将内存清零,再写入对象头(存放哈希码、GC年龄、锁状态、类型指针等),最后执行构造函数进行属性赋值。HotSpot 的对象布局包括对象头、实例数据和对齐填充,默认开启指针压缩(-XX:+UseCompressedOops)以在 64 位平台上使用 32 位指针降低内存占用。JOL 可查看对象实际大小。逃逸分析结合标量替换可将不逃逸对象分配到栈上,减轻堆 GC 压力。

JVM类加载机制

JVM 在执行 main 方法前,会通过类加载器把主类及其依赖逐步加载。加载过程分为加载、验证、准备、解析、初始化五阶段;加载时在方法区生成 Class 对象,验证检查字节码合法性,准备为静态字段分配默认值,解析把符号引用转为直接引用,初始化执行静态代码块并赋予指定值。JVM 共有三种内建加载器:引导类加载器负责 JRE/lib 下核心库,扩展类加载器负责 lib/ext 目录,应用类加载器负责 classpath 中的用户类,还可以自定义加载器。加载器采用双亲委派模型:先让父加载器尝试加载,若未找到才由当前加载器自行查找,这保证了核心类的唯一性并避免重复加载。示例代码展示了类的延迟加载、各加载器的实际路径以及 ClassLoader.loadClass 的实现逻辑。

深入理解Java虚拟机(JVM):内存模型与垃圾回收机制

本文系统阐述了JVM的内存结构及垃圾回收机制。首先介绍了程序计数器、虚拟机栈、本地方法栈、Java堆和方法区五大内存区域的作用与特点;随后解析了四类GC算法——标记‑清除、复制、标记‑整理和分代收集,并给出GC调优要点,包括选择合适的回收器(Serial、Parallel、CMS、G1)、合理配置堆大小、优化对象分配以及使用VisualVM、JConsole等工具监控分析。掌握这些可提升代码性能、避免内存泄漏,并在面试中展示深厚技术功底。

Java面试必会知识点

抱歉,我无法直接访问该链接中的内容。请您把文章的正文粘贴在这里,我会根据提供的文本为您生成符合要求的摘要。

面试现场【JVM篇】

本文系统梳理了 JVM 面试常见的 20 题及详细答案,涵盖内存结构(程序计数器、虚拟机栈、本地栈、堆、方法区、直接内存)、垃圾回收原理(GC Roots、引用计数、根可达、分代收集、三色标记、标记‑清除/复制/整理算法、STW 与安全点、OopMap)以及常用 GC 类型(Serial、ParNew、Parallel Scavenge/Old、CMS、G1 等)和相关概念(四种引用、对象栈上分配、类加载、双亲委派、OOM 排查等),为面试提供完整的知识框架。

面试现场【综合篇】

本篇面试指南围绕系统设计与实现展开,涵盖项目亮点、零拷贝原理、五大IO模型及NIO与多路复用区别、Future阻塞获取结果机制、ReentrantLock 与 synchronized 的实现与差异、AQS、乐观/悲观锁、Paxos 协议、B+树特性、TCP 拥塞控制、JVM 实践、数据库分库分表及其缺点、分布式事务(TCC)方案、RocketMQ 消息可靠性保证,以及常见算法题。通过概念阐释与实现细节,帮助读者系统复习面试热点。

JVM之RTTI与反射

RTTI(运行时类型识别)通过获取 Class 对象来在运行时获取已知类的完整信息,获取方式包括 Class.forName、.class 和对象的 getClass(),前者会立即初始化类,后者在首次使用静态成员时才初始化。反射则用于编译时未知的类:在运行时加载对应的 .class 文件后,可通过 Class 的 getMethods、getConstructors 等获取 Method、Constructor 对象并实例化对象。核心区别在于 RTTI 需要编译期已知类名并在编译时检查 .class,而反射在运行时才打开并检查 .class,实现对未知类型的动态操作。

JVM垃圾收集器ParNew&CMS与底层三色标记算法

文章介绍了JVM分代回收的基本原理,阐述了新生代采用复制算法、老年代使用标记‑清除或标记‑整理的原因,并详细比较了Serial、Parallel、ParNew、CMS等收集器的实现与适用场景。重点解析了CMS的四阶段并发标记、三色标记、写屏障及其产生的浮动垃圾、漏标问题,提供了ParNew+CMS在大流量电商系统中的参数调优方案,强调通过合理设置堆、Survivor、晋升阈值等可降低Full GC频率,提高响应时延。

JVM垃圾收集器汇总

Serial 是单线程复制收集器,适用于 Client 模式小堆,停顿可接受;ParNew 为其多线程版,可配合 CMS 使用,在 Server 环境多 CPU 时提升并行度。Parallel Scavenge 同样是多线程复制收集器,侧重吞吐量,通过‑XX:GCTimeRatio、‑XX:MaxGCPauseMillis 调节;对应的老年代有 Serial Old(单线程标记‑整理)和 Parallel Old(多线程标记‑整理),后者与 Parallel Scavenge 组合实现高吞吐。CMS 采用并发标记‑清除,目标最短停顿,但对 CPU 敏感、产生碎片且无法处理浮动垃圾。G1 采用分区‑并行‑增量回收,提供可预测的停顿时间,调参主要是‑XX:MaxGCPauseMillis 等。整体上,JVM 提供了从单线程到并行、从低停顿到高吞吐的多种收集器,以满足不同应用场景的性能需求。

JVM垃圾收集器G1&ZGC

G1 是面向服务器的分代收集器,将堆划分为约 2048 个等大小 Region,动态在年轻代、老年代和 Humongous 区之间切换。通过并发标记、STW 初始/最终标记以及基于回收价值排序的 Cleanup 阶段,G1 在用户指定的 ‑XX:MaxGCPauseMillis 目标停顿内优先回收收益最高的 Region,采用复制算法几乎消除碎片,并提供丰富的调参手段(Region 大小、年轻代比例、触发阈值等),适合 8 GB 以上、停顿要求在数百毫秒的高吞吐场景。 ZGC(JDK 11 起)是面向低延迟的单代收集器,支持 TB 级堆,停顿始终 ≤ 10 ms,且不随堆大小增长。它同样采用 Region(小/中/大)布局,利用读屏障、颜色指针和自愈转发实现全并发的标记‑整理、准备‑重分配、重映射四阶段,并对 NUMA 架构感知。ZGC 牺牲约 15% 吞吐以换取极短、可预测的停顿,适用于对响应时间极其敏感的大内存应用。

JVM内存模型深度剖析与优化

文章系统阐述了JVM的整体结构与内存模型,解释了Minor GC中对象复制后引用的更新机制,并详细列举了常用JVM参数(-Xms、-Xmx、-Xmn、-Xss、-XX:NewRatio、-XX:SurvivorRatio、-XX:MetaspaceSize/MaxMetaspaceSize)的含义与调优策略。通过示例演示StackOverflowError,指出‑Xss对栈帧数和线程数的影响,提出在高并发业务中应让对象尽量在新生代分配回收、限制老年代晋升并预留充足内存的实用建议。