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

【jvm】堆空间分代思想

目录

          • 1. 说明
          • 2. 分代原理
            • 2.1 对象生命周期差异
            • 2.2 分代策略
          • 3. 新生代(Young Generation)
            • 3.1 区域划分
            • 3.2 对象分配
            • 3.3 晋升条件
          • 4. 老年代(Old Generation)
            • 4.1 对象存放
            • 4.2 垃圾回收
          • 5. 分代垃圾回收算法
            • 5.1 复制算法
            • 5.2 标记-清除算法
            • 5.3 标记-整理算法

1. 说明
  • 1.JVM堆空间分代思想是基于对象的生命周期不同而提出的,目的是为了优化垃圾回收机制,提高内存管理效率。
  • 2.这种分代策略将堆内存划分为不同的区域,每个区域存放不同生命周期的对象,从而采用不同的垃圾回收策略。
2. 分代原理
2.1 对象生命周期差异
  • 1.在Java程序中,对象的生命周期有很大差异。
  • 2.有些对象很快就会被回收,而有些对象则会长时间存活。
  • 3.如果将所有对象都放在同一个区域进行管理,那么垃圾回收时会遍历整个区域,效率会很低。
  • 4.因此,JVM将堆内存划分为不同的区域,以优化垃圾回收过程。
2.2 分代策略
  • 1.JVM堆内存通常被划分为新生代(Young Generation)和老年代(Old Generation)。
  • 2.新生代用于存放生命周期较短的对象,而老年代则用于存放生命周期较长的对象。
  • 3.通过这种分代策略,JVM可以针对不同的对象采用不同的垃圾回收算法,从而提高内存管理效率。
3. 新生代(Young Generation)
3.1 区域划分
  • 1.新生代通常被划分为三个区域:Eden区、From Survivor区(也称为S0区)和To Survivor区(也称为S1区)。
  • 2.这三个区域的空间大小比例通常为8:1:1,但可以通过JVM参数-XX:SurvivorRatio进行调整。
3.2 对象分配
  • 1.新创建的对象通常会被分配到Eden区。
  • 2.当Eden区空间不足时,JVM会触发一次Minor GC(也称为Young GC),回收Eden区中的不再使用的对象,并将存活的对象复制到From Survivor区或To Survivor区。
  • 3.复制过程中,对象的年龄会加1。
  • 4.当From Survivor区或To Survivor区空间不足时,JVM会再次触发Minor GC,并将存活的对象复制到另一个Survivor区或老年代。
3.3 晋升条件
  • 1.对象在新生代中的存活时间达到一定程度(默认是15次Minor GC,可以通过-XX:MaxTenuringThreshold参数调整)后,会被晋升到老年代。
  • 2.如果对象的大小超过了-XX:PretenureSizeThreshold参数设置的值,也会直接被分配到老年代。
4. 老年代(Old Generation)
4.1 对象存放
  • 1.老年代用于存放生命周期较长的对象,以及从新生代晋升过来的对象。
4.2 垃圾回收
  • 1.当老年代空间不足时,JVM会触发一次Full GC(也称为Major GC或Old GC),回收老年代中的不再使用的对象。
  • 2.Full GC的速度通常比Minor GC慢很多,因为它需要遍历整个堆内存。
5. 分代垃圾回收算法
5.1 复制算法
  • 1.新生代通常采用复制算法进行垃圾回收。
  • 2.该算法将内存划分为两个相等的区域,每次只使用其中一个区域进行对象分配。
  • 3.当该区域空间不足时,将存活的对象复制到另一个区域,并清空当前区域。
  • 4.复制算法的优点是效率高、复制过程简单。
  • 5.缺点是内存利用率低,因为每次只能使用一半的内存空间。
5.2 标记-清除算法
  • 1.老年代通常采用标记-清除算法进行垃圾回收。
  • 2.该算法首先标记出所有不再使用的对象,然后清除这些对象所占用的内存空间。
  • 3.标记-清除算法的优点是内存利用率高。
  • 4.缺点是效率较低,因为需要遍历整个堆内存进行标记和清除操作。
  • 5.标记-清除算法还会产生内存碎片问题。
5.3 标记-整理算法
  • 1.为了解决标记-清除算法产生的内存碎片问题,老年代还可以采用标记-整理算法进行垃圾回收。
  • 2.该算法在标记出所有不再使用的对象后,会对存活的对象进行整理,使它们连续存放在内存中。
  • 3.标记-整理算法的优点是解决了内存碎片问题。
  • 4.缺点是效率较低,因为需要额外的整理操作。

http://www.kler.cn/a/382560.html

相关文章:

  • 20250110_ PyTorch中的张量操作
  • Zstandard压缩算法
  • Lua语言中常用的字符串操作函数
  • 如何在 Ubuntu 22.04 上安装 Nagios 服务器教程
  • 【Docker】docker compose 安装 Redis Stack
  • 前端 图片上鼠标画矩形框,标注文字,任意删除
  • Renesas R7FA8D1BH (Cortex®-M85) Flash的功能介绍
  • 美畅物联丨物联网通信新纪元:Cat.1与5G RedCap的差异化应用
  • [linux驱动开发--读设备树] 基于qemu9.1+linux内核6.11.0
  • Spire.PDF for .NET【页面设置】演示:获取 PDF 文件中的页数
  • python全栈开发《60.获取两个集合的差集》
  • 摩尔线程嵌入式面试题及参考答案(2万字长文)
  • 突破1200°C高温性能极限!北京科技大学用机器学习合成24种耐火高熵合金,室温延展性极佳
  • MongoDB笔记03-MongoDB索引
  • 站长推荐使用站群服务器的原因
  • [mysql]mysql的DML数据操作语言增删改,以及新特性计算列,阿里巴巴开发手册mysql相关
  • 探索人工智能的世界:构建智能问答系统之前置篇
  • 数据结构 ——— 链式二叉树oj题:相同的树
  • Spring Boot 中的拦截器 (HandlerInterceptor) 使用方案
  • 基于Halcon的支持向量机(SVM)技术的特征分类
  • B2119 删除单词后缀
  • 全文检索ElasticSearch到底是什么?
  • 计算机网络易混淆知识点串记
  • 【JAVA基础】HashMap详细
  • Node.js NPM以及REPL(交互式解释器) 使用介绍(基础介绍 二)
  • 编写虚拟的GPIO控制器的驱动程序:和pinctrl的交互使用