当前位置: 首页 > news >正文

JVM 内存模型与垃圾回收过程详解

JVM 内存模型与垃圾回收过程详解

文章目录

  • JVM 内存模型与垃圾回收过程详解
    • 1. JVM内存分区
      • 1.1 具体分区
      • 1.2 JVM内存分区的必要性
    • 2. 垃圾回收
      • 2.1 CMS垃圾回收器
      • 2.2 G1垃圾回收器
      • 2.3 JVM垃圾回收从新生代到老年代

1. JVM内存分区

1.1 具体分区

Java虚拟机(JVM)的内存模型主要分为两个大区:新生代(Young Generation)和老年代(Old Generation)。新生代进一步细分为三个区域:Eden区、Survivor区,而Survivor区又分为From Survior区(S0)和To Survior区(S1)。

在这里插入图片描述

1.2 JVM内存分区的必要性

分代收集算法是JVM垃圾回收的核心策略之一,它将堆内存划分为几个不同的区域,以便更有效地管理不同生命周期的对象。

  • 分代收集算法的优势:这种策略能够保证高速的读写操作同时保持内存的连续性。
  • 内存分区的目的:通过分区,可以针对不同类型的对象采取不同的回收策略,提高垃圾回收的效率。

2. 垃圾回收

2.1 CMS垃圾回收器

  • 分代:CMS(Concurrent Mark Sweep)垃圾回收器将堆内存分为新生代、老年代和永久代(Java 8后改为元空间Metaspace)。
  • 工作流程
    • 初始标记:一个短暂的停止-the-world过程,标记所有从根可达的老年代对象。
    • 并发标记:与应用程序线程并发执行,继续标记所有可达对象。
    • 重新标记:再次停止-the-world,修正并发标记阶段的变化。
    • 并发清理:与应用程序线程并发执行,清理已标记为死亡的对象。
  • 适用场景
    • CMS适用于对响应时间要求较高的系统,因为它试图减少垃圾回收对应用程序的影响,但可能会产生较多的内存碎片。

2.2 G1垃圾回收器

  • 分代:G1(Garbage-First)垃圾回收器将堆内存划分为多个Region,这些Region可以是新生代或老年代。
  • 工作流程
    • 混合收集:初始阶段,G1执行一个类似于CMS的混合收集,清理新生代和老年代。
    • 标记阶段:使用Region-based的标记算法识别所有可达对象。
    • 预备阶段:G1计算每个Region的垃圾回收价值(GC Value),并决定回收哪些Region以及回收多少内存。
    • 回收阶段:G1并发地回收选定的Region,分段进行,不会影响应用程序的吞吐量。
  • 适用场景
    • G1适用于多核处理器,旨在提供高吞吐量和低延迟,同时减少内存碎片。

2.3 JVM垃圾回收从新生代到老年代

  1. 对象创建:程序启动时,在Eden区创建大量临时对象。
  2. Eden区满:当Eden区空间不足时,通过可达性算法标记所有从根可达的对象,将它们放入S0区清空Eden区
  3. 复制/清除Eden区再次满时,将S0和S1交换角色,通过复制/清除算法将数据复制到S0区
  4. 对象晋升:如果对象在新生代经历了预设的年龄阈值(如15次Minor GC)后仍然存活,它会被晋升到老年代。
  5. Survivor空间不足:如果Survivor空间不足以容纳存活对象,一些存活时间较长的对象可能会直接晋升到老年代。
  6. 大对象:如果一个数组或对象的大小超过新生代最大容量,它将直接在老年代分配
  7. 特定对象:某些特定对象(如使用Finalize方法的对象)可能会被设置为总是直接进入老年代。
http://www.lryc.cn/news/456365.html

相关文章:

  • python:PyPDF2 将多个图片转换为pdf,再合并成一个PDF文件
  • Python精选200Tips:186-190
  • C、C++常用数据结构:链表
  • 【devops】devops-ansible之剧本变量使用
  • 《Linux从小白到高手》理论篇:一文概览常用Linux重要配置文件
  • 采购管理流程:掌握最后阶段的关键要点
  • cherry-markdown开源markdown组件详细使用教程
  • Android SystemUI组件(10)禁用/重启锁屏流程分析
  • 【Geeksend邮件营销】外贸邮件中的一些常用语
  • 配置静态ip
  • [LeetCode] LCR170. 交易逆序对的总数
  • 大开眼界,原来指针还能这么玩?
  • 揭秘选择知识产权管理系统的常见误区,避免踩坑
  • 计算机组成原理之存储器的分类
  • Linux(不同版本系统包含Ubuntu)下安装mongodb详细教程
  • 如何扫描HTTP代理:步骤与注意事项
  • 【分布式微服务云原生】gRPC与Dubbo:分布式服务通信框架的双雄对决
  • Python | Leetcode Python题解之第450题删除二叉搜索树中的节点
  • [Linux]从零开始的网站搭建教程
  • 牛客——xay loves or与 __builtin_popcount的使用
  • Docker学习和部署ry项目
  • Linux中设置cd命令后直接显示当前目录下的所有文件
  • 【RTCP】报文学习笔记
  • Solidity优质例子(二)物流的增删改查智能合约(附truffle测试)
  • 对android binder的一些疑问及解答
  • 主流麦克风阵列有哪些?
  • 几个快速压缩图片大小的方法!
  • 怎么避免在pod产生-派生炸弹(Fork Bomb)? k8s(kubernetes)
  • MySQL中的嵌套查询
  • win10 提示pl2303hxa已停产,请联系供货商解决方案