JVM内存模型与垃圾回收全解析

Java工程师必备:JVM原理、内存模型、调优、垃圾回收机制、面试题 在如今这个时间和知识都是碎片化的时代,C站根据C1-C4认证的成长路径,进行知识细化整理,形成系统化的知识图谱。 通过调研一线互联网大厂的招聘JD,小编对标C站能力认证要求,为大家整理了系列技术干货合集,助力小伙伴们顺利进大厂~ 小编根据C4认证的成长路径整理了Java的相关资源,从零基础带你进入Java的世界。 欢迎大家扫描文末二维码,一起学习~ 一、JVM原理 【JVM原理最全、清晰、通俗讲解,五天40小时吐血整理】 【JVM工作原理】 【初探JVM原理与结构】 【JVM原理和. 阅读详情

JVM/JMM内存模型、垃圾回收与OOM问题深度全解

一、JVM内存结构与JMM内存模型:存储与交互的二维视角

1. JVM内存结构 (运行时数据区)
这是JVM在运行Java程序时,对物理内存的逻辑划分,是数据存储的静态结构。

区域线程共享性核心作用与存储内容异常类型
堆 (Heap)共享存储所有对象实例和数组。是GC管理的主要区域,内部可细分为新生代(Eden, Survivor0, Survivor1)和老年代。OutOfMemoryError: Java heap space
方法区 (Method Area)共享存储已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。JDK 8后由“元空间”(Metaspace)实现,使用本地内存。OutOfMemoryError: Metaspace
虚拟机栈 (JVM Stack)私有描述Java方法执行的内存模型。每个方法执行对应一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。StackOverflowError
本地方法栈 (Native Method Stack)私有为JVM使用到的Native方法(如C/C++函数)服务。StackOverflowError
程序计数器 (PCR)私有当前线程所执行的字节码的行号指示器。是唯一一个没有规定任何OOM情况的区域。无

2. Java内存模型 (JMM)
JMM是一个抽象规范,定义了Java程序中共享变量的访问规则,旨在解决多线程环境下的可见性、有序性、原子性问题。它规定了线程如何与主内存及工作内存进行交互。

  • 核心抽象:JMM将内存抽象为主内存(存储共享变量原始值)和线程工作内存(存储该线程使用变量的副本)。
  • 交互协议:通过8种原子操作(lock, unlock, read, load, use, assign, store, write)定义变量从主内存读取、在工作内存操作、写回主内存的严格流程。
  • Happens-Before 原则:JMM提供的内存可见性保证的核心规则。如果A happens-before B,那么A的结果对B可见。关键规则包括:
    1. 程序顺序规则:同一线程内,书写在前面的操作happens-before后面的操作。
    2. 监视器锁规则:对一个锁的解锁happens-before于随后对这个锁的加锁。
    3. volatile变量规则:对一个volatile变量的写happens-before于任意后续对这个volatile变量的读。
    4. 传递性:若A happens-before B,且B happens-before C,则A happens-before C。

3. 关键字的JMM语义与实现

  • volatile:
    • 可见性:写操作立即刷新到主内存,并使其他线程的缓存副本失效。
    • 有序性:通过插入内存屏障禁止指令重排序。
    • 非原子性:不保证复合操作(如i++)的原子性。
    // volatile 示例
    public class VolatileExample {
        private volatile boolean flag = false; // 保证flag的修改对所有线程立即可见
        
        public void writer() {
            flag = true; // 写操作,会立即同步到主内存
        }
        
        public void reader() {
            if (flag) { // 读操作,会从主内存重新加载最新值
                // do something
            }
        }
    }
    
  • synchronized:
    • 基于监视器锁(Monitor) 实现,保证进入同步块/方法的线程对共享资源的独占访问。
    • 保证原子性、可见性和有序性。进入同步块前清空工作内存并从主内存加载,退出时刷新工作内存到主内存。
  • final:
    • 被final修饰的字段在构造器中被正确初始化后(没有“this”逃逸),其值对其他线程是可见的,无需同步。

二、可达性分析与三色标记法:垃圾识别的理论基础

1. 可达性分析
这是判断对象是否存活的根搜索算法。以一系列“GC Roots”对象为起点,向下搜索,形成引用链。任何到GC Roots没有引用链相连的对象,即为不可达,可被回收。

GC Roots 包括:

  • 虚拟机栈(栈帧中的局部变量表)引用的对象。
  • 方法区中类静态属性引用的对象。
  • 方法区中常量引用的对象。
  • 本地方法栈中JNI(Native方法)引用的对象。
  • Java虚拟机内部引用(如系统类加载器、异常对象等)。
  • 所有被同步锁(synchronized)持有的对象。

2. 三色标记法
这是在可达性分析过程中,用于实现并发标记的具体算法。它将对象标记为三种颜色以追踪扫描进度:

  • 白色:对象尚未被垃圾回收器访问。标记结束后仍为白色的对象即为垃圾。
  • 灰色:对象已被访问,但其引用的其他对象尚未被完全检查。
  • 黑色:对象已被访问,且其所有引用都已被检查。黑色对象被认为是安全的,不会直接指向白色对象(在强三色不变式下)。

标记过程伪代码:

// 初始化:所有对象为白色
Set<Object> whiteSet = new HashSet<>(allObjects);
Set<Object> greySet = new HashSet<>();
Set<Object> blackSet = new HashSet<>();

// 初始标记:GC Roots直接引用的对象标记为灰色
for (Object root : gcRoots) {
    if (whiteSet.contains(root)) {
        greySet.add(root);
        whiteSet.remove(root);
    }
}

// 并发标记:遍历对象图
while (!greySet.isEmpty()) {
    Object current = greySet.poll(); // 取出一个灰色对象
    // 扫描当前对象的所有引用
    for (Object child : current.getReferences()) {
        if (whiteSet.contains(child)) { // 如果子对象是白色
            greySet.add(child);          // 将其变为灰色,等待扫描
            whiteSet.remove(child);
        }
    }
    // 当前对象的所有引用已扫描完毕,变为黑色
    blackSet.add(current);
}
// 标记结束后,whiteSet中剩余的对象即为不可达的垃圾对象

3. 并发标记下的“对象消失”问题与解决方案
在用户线程与标记线程并发执行时,可能破坏标记正确性,导致存活对象被误标为白色。其发生的充分必要条件是:

  1. 赋值器插入了一条从黑色对象到白色对象的新引用。
  2. 赋值器删除了全部从灰色对象到该白色对象的直接或间接引用。

解决方案通过在写屏障中增加额外操作来破坏上述条件之一。

收集器解决方案原理(破坏哪个条件)写屏障操作(伪代码示意)
CMS增量更新 (Incremental Update)破坏条件1。关注引用的插入。void write_barrier(Object field, Object newVal) { if (isBlack(field.holder) && isWhite(newVal)) { remarkSet.add(field.holder); // 将黑色对象重新标记为灰色 } field = newVal; }
G1原始快照 (SATB)破坏条件2。关注引用的删除。void write_barrier(Object field, Object oldVal) { if (oldVal != null && isWhite(oldVal)) { satbBuffer.record(oldVal); // 记录被删除的引用(白色对象) } field = newVal; }

三、CMS与G1垃圾回收过程深度对比

1. CMS (Concurrent Mark-Sweep) 回收过程
CMS采用 “标记-清除” 算法,旨在获取最短回收停顿时间。

阶段工作内容是否STW与三色标记/可达性分析的关系
初始标记仅标记所有与 GC Roots 直接关联 的对象。速度极快。是执行可达性分析的第一步,找出根对象。
并发标记从初始标记的对象出发,递归遍历整个老年代对象图,标记所有可达对象。否核心阶段,使用三色标记算法与用户线程并发执行。
重新标记修正并发标记期间因用户线程运行而产生的对象引用变化。是处理增量更新写屏障记录的灰色对象,完成最终标记。
并发清除清理未被标记(白色)的死亡对象。否直接回收内存,不移动对象,产生内存碎片。

2. G1 (Garbage-First) 回收过程
G1采用分区模型和可预测停顿设计。其核心是全局并发标记周期,为Mixed GC做准备。

阶段工作内容是否STW与三色标记/可达性分析的关系
初始标记标记所有与 GC Roots 直接关联 的对象。通常“借用”一次Young GC的停顿完成。是同CMS,执行可达性分析的根扫描。
并发标记从初始标记的对象出发,递归遍历整个堆(所有Region),标记存活对象并计算各Region的存活信息。否核心阶段,使用三色标记算法与用户线程并发执行。
最终标记处理并发标记阶段结束后剩余的SATB缓冲区记录。是处理SATB写屏障记录的、在并发开始时存活的对象,确保它们不被漏标。
筛选回收根据用户设定的最大停顿时间,选择回收价值最高的若干Region构成回收集,将其中存活对象复制到空Region,并清空旧Region。是基于之前标记的结果进行复制整理,避免碎片。这是G1实现可预测停顿的关键。

3. CMS与G1的核心区别总结

特性维度CMSG1
设计目标低延迟优先,减少单次停顿。吞吐量与延迟平衡,提供可预测的停顿时间模型。
堆布局连续的年轻代、老年代物理分区。划分为多个大小相等的Region,逻辑分代。
算法标记-清除。整体标记-整理,局部(Region间)复制算法。
碎片化严重,可能触发压缩式Full GC。有效控制,通过复制整理避免碎片。
停顿预测不可控。核心特性,通过-XX:MaxGCPauseMillis设定目标。
并发问题处理增量更新(关注引用插入)。原始快照SATB(关注引用删除)。
适用场景中小堆、CPU资源丰富、追求低延迟的Web应用。大内存(6G+)服务端应用,要求停顿可控。

四、G1在内存不足时的处理策略与“满分面试答案”

G1内存不足处理策略:

  1. 提升Young GC频率:加速回收短期对象,缓解内存分配压力。
  2. 扩大Mixed GC回收集:在后续Mixed GC中,不仅回收价值最高的Region,也会纳入更多Region以释放更多空间。
  3. 触发Full GC(失败保障):当上述措施无效时(如并发标记周期完成前空间耗尽、晋升失败、巨型对象分配失败),G1会退化为单线程的Serial Old收集器,执行一次全堆的标记-整理Full GC。此过程STW时间极长,是性能灾难。

G1满分面试答案要点(深度详解):
核心思想:G1是一款面向服务端、大内存、多核处理器的垃圾收集器,其设计目标是在可预测的停顿时间内实现高吞吐量。

  1. 分区模型:将整个堆划分为多个大小固定(如2M)的Region,每个Region可以是Eden、Survivor、Old或Humongous(存放大对象)区。这使得G1可以避免在整个堆上进行回收,而是选择回收价值最高(即垃圾最多)的Region进行回收。
  2. 可预测停顿:通过参数-XX:MaxGCPauseMillis(默认200ms)设定目标停顿时间。G1会根据这个目标,在每次回收时动态选择回收一部分Region,而不是回收整个代,从而控制停顿时间。
  3. 回收过程:
    • Young GC:当Eden区满时触发,采用复制算法将Eden和Survivor区的存活对象移动到新的Survivor区或晋升到Old区。
    • Mixed GC:当老年代占用比例超过阈值(-XX:InitiatingHeapOccupancyPercent)时触发全局并发标记周期(初始标记、并发标记、最终标记、筛选回收)。标记完成后,Mixed GC会同时回收年轻代和部分被标记为可回收的老年代Region。
  4. 并发标记与SATB:G1使用原始快照(SATB) 算法解决并发标记时的“对象消失”问题。它在并发标记开始时为堆建立一个逻辑上的“快照”,任何在标记期间被删除的引用都会被记录在SATB缓冲区中,在最终标记阶段重新扫描这些记录,确保存活对象不被漏标。
  5. 内存不足处理:G1会优先通过更频繁的Young GC和扩大Mixed GC回收集来应对。如果失败,会触发一次单线程、全堆、STW时间极长的Full GC,这是需要极力避免的。
  6. 调优关键参数:
    • -XX:MaxGCPauseMillis:目标最大停顿时间。
    • -XX:InitiatingHeapOccupancyPercent:触发并发标记周期的堆占用率阈值。
    • -XX:G1HeapRegionSize:Region大小。
    • -XX:G1ReservePercent:预留空间百分比,用于应对晋升失败。

五、OOM类型全解析、影响与解决方案

1. OOM类型全解析
OOM是JVM内存管理系统抛出的Error,表示无法再分配出足够的内存。

OOM 类型触发区域主要原因对应用的影响
Java heap space堆对象实例过多;内存泄漏;堆大小设置不足。最常见。抛出线程终止。若为主线程,应用停止。
Metaspace元空间动态加载类过多(反射、CGLib、OSGi等);元空间大小设置过小。后续类加载失败,功能异常,应用通常无法正常运行。
GC overhead limit exceeded堆JVM花费超过98%时间做GC,但回收不到2%堆空间。应用吞吐量骤降,JVM保护性抛出错误,可能导致应用终止。
Unable to create new native thread系统内存创建的线程数超过系统或JVM限制(如ulimit -u)。无法创建新线程,依赖线程池的任务无法执行,应用停滞。
Direct buffer memory直接内存NIO的DirectByteBuffer使用过多或泄漏;-XX:MaxDirectMemorySize设置过小。NIO操作失败,影响网络通信和文件处理。
Requested array size exceeds VM limit堆尝试分配超过JVM限制的数组(接近Integer.MAX_VALUE-8)。分配数组的代码失败,线程终止。

2. OOM后是否影响整个应用?
OOM 不会直接导致整个JVM进程崩溃。它只是一个Error,抛出该错误的线程会终止。然而:

  • 如果抛出OOM的线程是关键线程(如主线程、RPC请求处理线程),则该线程负责的业务将中断。
  • 如果内存泄漏持续发生,频繁的OOM会导致大量线程终止,最终应用服务能力严重下降甚至完全不可用。
  • 某些OOM(如Metaspace)会导致类加载器等关键系统组件失效,使应用进入不可恢复状态。

结论:OOM意味着JVM层面的资源耗尽。虽然进程不一定立即退出,但应用已处于严重功能受损或不可用状态。

3. OOM解决方案与排查流程

  1. 立即响应:
    • 查看应用日志,定位OOM类型和堆栈信息。
    • 如果条件允许,立即触发Heap Dump(-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dump.hprof)。
  2. 分析诊断:
    • 使用MAT、JProfiler、VisualVM等工具分析Heap Dump文件。
    • 重点关注大对象、对象数量异常多的类、GC Roots到这些对象的引用链,查找内存泄漏点。
  3. 针对性解决:
    • Java heap space:
      • 检查代码:修复内存泄漏(如未关闭的连接、集合类无节制添加、监听器未移除等)。
      • 调整JVM参数:适当增加堆

参考来源

 

深入理解JVM内存模型与垃圾回收机制:从原理到实战调优 本文由王文峰撰写,深入探讨了JVM内存模型与垃圾回收机制,旨在帮助Java开发者解决生产环境中的内存管理问题。文章首先解析了JVM内存结构,包括Metaspace、堆内存分代和直接内存分配,接着详细介绍了对象分配与晋升机制,并对比了不同垃圾回收器的适用场景。随后,文章通过源码级解析G1收集器的内存布局、并发标记流程和记忆集优化,并结合电商平台订单系统的调优案例,展示了如何通过JVM参数调整和代码修复解决Full GC问题。最后,文章提供了性能优化进阶技巧,如逃逸分析和Shenandoah收集器的使用,并展望 阅读详情

相关推荐

【QEMU系统分析之TPM篇(一)】

本文以 QEMU 8.2.2 为例,分析其 TPM-emulator 模块的实现,并为 QEMU 添加 Windows 平台的TPM 模拟器的支持。

David唐辉的博客 1190

JVM 内存模型与垃圾回收机制全解析:架构、算法、调优实践

本文深度剖析 JVM 内存模型与垃圾回收机制,涵盖内存区域划分(堆、栈、方法区等)、对象分配与回收流程、核心算法(标记-清除、复制、分代收集)及主流 GC 器(G1/ZGC)原理。结合性能调优实践(内存泄漏排查、GC 日志分析、参数配置),提供从理论到落地的系统性指南,助力开发者优化 Java 应用性能,提升稳定性与资源利用率。

大模型全栈工程师 · Thanks_ks 1347

Matlab实战:用递归最小二乘法(RLS)搞定动态系统参数辨识(附完整代码)

本文通过Matlab实战,详细介绍了如何利用递归最小二乘法(RLS)进行动态系统参数辨识。文章从理论优势切入,提供了完整的仿真数据生成、RLS算法核心实现代码,并对参数收敛过程、预测误差及不同遗忘因子的影响进行了可视化分析与性能评估,为工程实践提供了清晰的指南。

weixin_29035405的博客 503

JVM内存模型、垃圾回收与类加载机制全解析

Java虚拟机(JVM)是Java程序运行的基石,其核心在于内存管理与执行引擎。内存模型定义了程序运行时的数据存储区域,包括线程私有的程序计数器、虚拟机栈和线程共享的堆、方法区等。垃圾回收机制则基于可达性分析算法,自动回收不再使用的对象内存,其中分代收集理论将堆划分为新生代和老年代,并衍生出Serial、CMS、G1等多种收集器以适应不同场景。类加载子系统负责将字节码文件加载到内存,并通过双亲委派模型确保类的唯一性与安全性。理解JVM内存结构、垃圾回收原理及类加载过程,对于诊断Full GC、内存泄漏等线上

weixin_34310369的博客 419

Cadence SKILL 语言实战指南:从函数列表到高效自动化脚本

本文是Cadence SKILL语言实战指南,旨在帮助芯片设计工程师从掌握核心函数列表出发,高效构建自动化脚本。文章详细解析了数据处理、数据库访问、流程控制及错误处理四类关键函数,并通过版图层批量修改与参数化单元生成两大实战场景,演示如何将函数组合成解决实际问题的自动化方案,从而显著提升Virtuoso环境下的工作效率。

beta5的博客 705

RK3568平台YOLO11模型部署实战:从环境搭建、模型转换到板端性能优化全解析

摘要: 本文详细介绍了在RK3568平台上从零部署YOLO11模型的完整流程。主要内容包括:1) 基于Conda搭建Python 3.8开发环境并安装RKNN-Toolkit2工具链;2) 使用LabelImg工具标注数据并构建YOLO格式数据集;3) 基于Ultralytics框架进行YOLO11模型训练及参数优化;4) 实现PyTorch→ONNX→RKNN的完整模型转换链。文章特别针对RK3568平台的NPU特性提供了关键参数配置建议,并分享了实际开发中的经验总结,最终可达到30FPS的稳定推理性能。

LXY_LOVE36的博客 279

Java虚拟机(JVM)内存模型与垃圾回收全解析 

基于这些算法,JVM提供了多种垃圾收集器,如串行收集器、并行收集器、CMS收集器、G1收集器等,G1收集器作为新一代收集器,将堆划分为多个Region,实现了分代收集与区域收集的结合,兼顾了吞吐量和停顿时间。线程共享区则包括方法区和堆,堆是对象实例的主要存储区域,也是垃圾回收的核心区域,方法区存储类信息、常量、静态变量等,在JDK1.8中方法区被元空间替代,元空间直接使用本地内存,避免了永久代的内存限制。垃圾回收的前提是判断对象是否存活,主流的判断算法有引用计数法和可达性分析算法。

yt66700的博客 378

数据服务:数据服务框架Magic-API 介绍及实践

接口快速开发框架 基于Java的接口快速开发框架,编写接口将通过magic-api提供的UI界面完成,自动映射为HTTP接口,无需定义Controller、Service、Dao、Mapper、XML、VO等Java对象即可完成常见的HTTP API接口开发 。在线页面快速开发平台 基于 vue 的在线页面快速开发平台,主要把所有的 vue 代码都改为在线配置,最终获得一个 json 格式的页面新一代爬虫平台 基于Java实现的新一代爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫。今天给大家安利一

GIS摆渡人 2063

深入理解Java虚拟机JVM内存模型与垃圾回收机制全解析

理解JVM内存模型是Java开发者进阶的必经之路。从程序计数器、虚拟机栈到堆和方法区,每一块内存区域都承担着独特的职责。而垃圾回收机制则是JVM自动内存管理的精髓,从引用判定到分代收集理论,再到各类经典的垃圾收集器,其设计哲学始终围绕着高效利用内存和减少应用停顿时间这两个核心目标。随着技术发展,ZGC、Shenandoah等新型收集器正不断突破停顿时间的极限。掌握这些底层原理,有助于开发者在实际项目中更好地进行性能调优、故障诊断,并编写出更健壮的Java应用程序。

threemissyou的博客 680

Experion PKS系列开发:I_O模块_ExperionPKS与第三方I-O模块的集成

通过上述步骤,可以成功将第三方I/O模块集成到Honeywell Experion PKS系统中,实现对现场设备的监视和控制。集成过程中需要注意选择合适的第三方模块,配置正确的通信参数,编写正确的控制逻辑,并进行充分的测试,以确保系统的稳定性和可靠性。不同的通信协议(如Modbus、Profibus、Ethernet/IP、CANopen、OPC UA)有其独特的配置和编程方法,但总体流程相似。在实际应用中,根据项目需求选择合适的协议和模块,可以有效提高系统的灵活性和适应性。

zhubeibei168的博客 1099

骑砍Ⅱ霸主MOD开发(16)-FaceKey&BannerKey

摘要:本文介绍了FaceKey人物模型和BannerKey旗帜模型的生成流程。FaceKey通过序列化参数生成人物模型,包括头部(脸部、嘴、睫毛、眼睛)、眉毛、头发、身体和躯干等组件,每个部分通过特定标签和骨骼绑定实现。BannerKey则通过解析参数生成旗帜模型,包括模型、贴图和颜色等元素。两种模型都采用参数化设计和XML配置文件实现模型生成与定制。

骑砍战团&霸主MOD开发 2285

[Java]深入理解Java虚拟机JVM内存模型与垃圾回收机制全解析

这个算法的基本思路是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。由于JVM的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,因此每个线程都有一个独立的程序计数器,各线程之间互不影响,独立存储,这类内存区域被称为“线程私有”的内存。方法区与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

subzero88的博客 407

2026软考中级-软件设计师笔记(送最新视频教程)

核心口诀:运控存输输(运算器、控制器、存储器、输入、输出)例题(2019年上半年):核心公式:数字签名流程:数字证书作用:死锁4个必要条件:死锁判断公式:处理策略:程序设计语言的四大核心成分:顺序表操作(时间复杂度):链表操作(时间复杂度):核心思想:频率高的字符用短编码,频率低的用长编码 → 最小化总编码长度构造步骤(贪心算法):前提:有序表(升序/降序) 步骤:时间复杂度:O(log₂n) 例:查找中核心思想:用哈希函数将关键字映射到存储位置 哈希冲突:不同关键字映射到同一位置 → 用链地址法或开放定址

36万+

JVM的4种垃圾回收算法、垃圾回收机制与总结

JVM的4种垃圾回收算法、垃圾回收机制与总结 - 知乎 https://zhuanlan.zhihu.com/p/54851319 JVM的4种垃圾回收算法、垃圾回收机制与总结 一、垃圾回收算法 1.标记清除 标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段。 在标记阶段首先通过根节点(GC Roots),标记所有从根节点开始的对象,未被标记的对象就是未被引用的垃圾对象。然后,在清除阶段,清除所有未被标记的对象。 适用场合: ...

我是guyue,guyue就是我O(∩_∩)O 5257

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

JVM 内存模型与垃圾回收

1. JVM内存模型 2. 垃圾查找算法 3. 垃圾回收算法 4. JVM内存分配策略 5. CMS与G1垃圾回收器 6. JVM 常见参数设置

谈谈1974 2889

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

JVM内存模型及垃圾回收

定义 通俗的来讲,jvm主要分为5个部分程序计数器、虚拟机枝、本地方法枝、 Java 堆、 方法区, 引用大佬总结的概括程序计数器用于存放下一条运行的指令,虚拟机栈和本地方法栈用于存放函数调用堆栈信息, Java 堆用于存放 Java 程序运行时所需的对象等数据,方法区用于存放程序的类元数据信息 。 程序计数器: 是一块很小的内存空间,每个线程私有,可以看作当前线程...

yumingzhu1的博客 1万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【JVM】的垃圾回收和内存模型

自动垃圾回收是查看堆内存、识别哪些对象正在使用、哪些对象未使用以及删除未使用对象的过程。正在使用的对象或引用的对象意味着程序的某些部分仍保留指向该对象的指针。程序的任何部分都不再引用未使用的对象或未引用的对象。因此,可以回收未引用对象使用的内存。在像 C 这样的编程语言中,分配和取消分配内存是一个手动过程。在 Java 中,释放内存的过程由垃圾回收器自动处理。基本流程可以描述如下。

chengxuyuanlaow的博客 864

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

Java 虚拟机(JVM)是 Java 语言的核心,它将编译后的字节码文件(.class文件)解释或编译为底层机器码,以便运行在各种操作系统上。通过 JVM,Java 实现了“编译一次,运行多处”的跨平台能力。字节码执行:加载、解析、执行 Java 字节码文件。内存管理:包括对象内存分配和垃圾回收。线程管理:为多线程 Java 程序提供运行环境。安全性:通过类加载器和运行时检查保障程序安全。了解 JVM 的工作原理是深入学习 Java 的基础,尤其是在性能优化和问题排查方面。

一名热衷于技术的全栈开发者,专注于前端与后端的全面技术探索。在这里,我将分享我在技术领域的学习与成长,助力更多开发者的进步。 1899

JVM内存模型及CMS、G1和ZGC垃圾回收器详解

1. JVM 内存模型 JVM 内存模型主要指运行时的数据区,包括 5 个部分,如下图所示。 栈也叫方法栈,是线程私有的,线程在执行每个方法时都会同时创建一个栈帧,用来存储局部变量表、操作栈、动态链接、方法出口等信息。调用方法时执行入栈,方法返回时执行出栈。 本地方法栈与栈类似,也是用来保存线程执行方法时的信息,不同的是,执行 Java 方法使用栈,而执行 native 方法使用本地方法栈。 程序计数器保存着当前线程所执行的字节码位置,每个线程工作时都有一个独立的计数器。程序计数器为执行 Ja

qqxhb 资源共享 3204

JVM 内存模型与垃圾回收机制深度解析

面试中,需结合具体场景(如 “线上出现 Full GC 频繁,如何排查?避免永久代内存溢出(如 Spring 动态代理生成大量类时),元空间大小可动态扩展,且字符串常量池(String Table)从永久代移至堆内存,减少 Full GC 压力。A:对象泄漏(如集合未正确释放)、大对象批量创建(如加载超大文件到内存)、内存分配策略不合理(新生代过小导致频繁 Full GC)。移除永久代(PermGen),类元数据(如类名、方法信息、常量池)存储在本地内存(Native Memory),由。

闫磊磊 892

JVM垃圾回收--内存模型/垃圾回收流程

本文介绍Java各个代的关系(内存模型)及垃圾收集流程。

IT利刃出鞘的博客 6618

JVM 及内存管理:掌握 Java 8 的内存模型与垃圾回收机制

本文从 JVM 内存模型到垃圾回收机制进行了全面解析,并介绍了 Java 8 中的重要改进。掌握这些知识不仅有助于提升代码性能,还能帮助你更好地定位和解决内存问题。在实际项目中,建议结合具体场景选择合适的垃圾回收器并进行调优,以最大化系统性能。

qq_36534560的博客 2179
上一篇: Kafka: 一条消息的完整“生命之旅”
下一篇: 精准定位Direct Buffer OOM的体系化排查实践
路飞说AI
博客等级 码龄10年 214粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值