加载中

JVM

文章分类

浏览该分类下的所有文章

12 篇文章 1

一次OOM排查实录

项目运行中日志突止,排查发现 Linux OOM Killer 于 2026‑04‑23 杀死了 Java 进程。根因是 2 GB 机器同时运行 3 个 Spring‑Boot 应用和 MySQL 8.0,JVM 未限制‑Xmx、MySQL 默认占用内存大且无 Swap,导致内存耗尽。通过为每个 JVM 设置相同的‑Xms/‑Xmx(512 M、256 M 等)、在 my.cnf 中缩减 innodb_buffer_pool、max_connections、关闭 performance_schema、调小缓存参数,并创建 2 GB swap,系统内存恢复健康,进程不再被 OOM 杀死。总结教训:小内存必须限制 JVM、调优 MySQL、配置 Swap,若业务继续增长建议迁移 MySQL 或升级机器。

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

对象创建首先检查类是否已加载、解析、初始化,随后在堆中分配内存。分配方式有指针碰撞(Bump‑Pointer)和空闲列表,采用CAS或线程本地分配缓冲(TLAB)解决并发冲突。内存分配后进行零值填充、设置对象头(包含哈希、GC年龄、锁状态及指向类元数据的指针),最后执行构造方法完成实例化。HotSpot 默认开启指针压缩(UseCompressedOops/UseCompressedClassPointers),在 64 位平台将对象指针压缩为 32 位,以降低内存占用并提升缓存与 GC 效率,堆小于 4 GB 时自动生效,超过 32 GB 则失效。JVM 通过逃逸分析判断对象是否会逃出方法作用域,若不会则可采用标量替换将其在栈上分配,减轻堆内存压力并提升性能。

JVM类加载机制

JVM 在运行 Java 程序时,首先通过类加载器把主类加载进内存,加载过程包括 加载‑验证‑准备‑解析‑初始化 五步。加载阶段读取字节码并生成 java.lang.Class 对象;验证检查字节码合法性;准备为静态字段分配默认值的内存;解析将符号引用转为直接引用;初始化执行静态代码块并赋予真实值。JVM 共有四类加载器:启动类加载器负责加载 JRE lib 目录下的核心库,扩展类加载器加载 ext 目录的 JAR,应用类加载器加载 CLASSPATH 下的用户类,用户可自行实现自定义加载器。类加载采用双亲委派模型:子加载器先委托父加载器查找,父未找到再由子自行加载,确保核心类优先由启动加载器完成。示例代码演示了类的延迟加载、不同加载器的层次结构以及 ClassLoader.loadClass 实现的委派逻辑。

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

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

Java面试必会知识点

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

面试现场【JVM篇】

文章提供了JVM面试常见题目及详尽答案,系统阐述了JVM内存结构(程序计数器、虚拟机栈、本地栈、堆、方法区、直接内存)、GC Roots 类型、四种引用(强、软、弱、虚)以及分代收集假设。进一步介绍了垃圾回收算法(标记清除、复制、标记整理)、STW 与安全点、OopMap 的作用,并概括了主流收集器(Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS)的特点和适用场景。

面试现场【综合篇】

文章围绕面试常见技术点展开,先示例如何从项目经验、设计优化和代码亮点切入;随后系统阐述零拷贝的概念、实现方式及其对上下文切换和拷贝次数的削减;归纳五种IO模型,比较NIO与多路复用(select、poll、epoll)的区别与优势;解析FutureTask阻塞获取结果的内部状态机与等待机制;对比ReentrantLock与synchronized的实现原理及适用场景;并简要涉及乐观/悲观锁、AQS、Paxos、B+树、TCP拥塞、JVM调优、分库分表、分布式事务、RocketMQ可靠性等面试热点。整体提供了技术要点的概念解释与实现细节,帮助读者在面试中快速组织答案。

JVM之RTTI与反射

RTTI(运行时类型识别)通过获取 Class 对象,在程序运行时获取已知类的完整类型信息,常用 Class.forName、.class 或对象的 getClass() 获得引用。反射则用于处理编译时未知的类,JVM 在运行时加载对应的 .class 文件后,可通过 Class 的 getMethods、getConstructors 等获取成员信息并实例化对象。二者的根本区别在于:RTTI 依赖编译时已知类并在加载时完成检查,而反射在运行时才打开并检查 .class 文件,实现对完全未知类型的动态操作。

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

文章阐述了JVM的分代垃圾回收策略:新生代使用复制算法,老年代采用标记‑清除或标记‑整理。分别介绍了Serial、Parallel、ParNew 与 CMS 四种收集器的实现原理和适用场景,重点说明 ParNew 可与 CMS 配合实现低停顿的并发回收,并列出 CMS 的关键参数配置。随后深入剖析 CMS 并发标记过程中的三色标记模型、写屏障、浮动垃圾与漏标问题,以及增量更新和 SATB 两种解决方案,帮助读者理解底层实现细节并进行针对性调优。

JVM垃圾收集器汇总

Serial:单线程、停顿大,适用于Client模式小堆;ParNew:Serial的多线程版,配合CMS使用;Parallel Scavenge:多线程复制收集,侧重吞吐量,可调‑XX:MaxGCPauseMills/‑XX:GCTimeRatio;Serial Old:单线程标记‑整理,Client或CMS备选;Parallel Old:Parallel Scavenge对应的老年代,多线程标记‑整理,提升服务器吞吐;CMS:并发标记‑清除,目标最短停顿,但占用CPU、产生碎片;G1:面向大堆的分代收集器,支持暂停时间可预测,调参简洁(‑XX:+UseG1GC、‑XX:MaxGCPauseMillis)。

JVM垃圾收集器G1&ZGC

G1是服务器用的Region分代收集器,采用复制算法并按回收价值优先选择Region,实现可预期停顿(‑XX:MaxGCPauseMillis),支持大堆、Humongous区及多参数调优,适用于8GB以上、停顿≤500ms的场景。ZGC是JDK11的单代并发标记‑整理收集器,基于不同大小Region、颜色指针和读屏障,实现堆大小无关、10 ms以下低延迟,支持TB级堆并感知NUMA。

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

本文系统阐述了JVM整体结构和内存模型,解析了Minor GC中对象复制与引用更新机制,详细介绍了常用JVM参数(-Xms、-Xmx、-Xmn、-Xss、MetaspaceSize等)的含义与调优方法,并通过StackOverflowError示例说明栈大小对线程数的影响。最后给出高并发订单系统的内存调优原则:尽量让对象在新生代分配回收,避免频繁老年代GC,并预留充足堆空间。