【jvm】堆空间分代思想

目录

          • [1. 说明](#1. 说明)
          • [2. 分代原理](#2. 分代原理)
            • [2.1 对象生命周期差异](#2.1 对象生命周期差异)
            • [2.2 分代策略](#2.2 分代策略)
          • [3. 新生代(Young Generation)](#3. 新生代(Young Generation))
            • [3.1 区域划分](#3.1 区域划分)
            • [3.2 对象分配](#3.2 对象分配)
            • [3.3 晋升条件](#3.3 晋升条件)
          • [4. 老年代(Old Generation)](#4. 老年代(Old Generation))
            • [4.1 对象存放](#4.1 对象存放)
            • [4.2 垃圾回收](#4.2 垃圾回收)
          • [5. 分代垃圾回收算法](#5. 分代垃圾回收算法)
            • [5.1 复制算法](#5.1 复制算法)
            • [5.2 标记-清除算法](#5.2 标记-清除算法)
            • [5.3 标记-整理算法](#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.缺点是效率较低,因为需要额外的整理操作。
相关推荐
程序猿进阶26 分钟前
堆外内存泄露排查经历
java·jvm·后端·面试·性能优化·oom·内存泄露
阿龟在奔跑12 小时前
引用类型的局部变量线程安全问题分析——以多线程对方法局部变量List类型对象实例的add、remove操作为例
java·jvm·安全·list
王佑辉12 小时前
【jvm】方法区常用参数有哪些
jvm
王佑辉13 小时前
【jvm】HotSpot中方法区的演进
jvm
Domain-zhuo13 小时前
什么是JavaScript原型链?
开发语言·前端·javascript·jvm·ecmascript·原型模式
Theodore_10221 天前
7 设计模式原则之合成复用原则
java·开发语言·jvm·设计模式·java-ee·合成复用原则
我是苏苏2 天前
Web开发:ORM框架之使用Freesql的DbFrist封装常见功能
java·前端·jvm
天草二十六_简村人2 天前
Java语言编程,通过阿里云mongo数据库监控实现数据库的连接池优化
java·jvm·数据库·mongodb·阿里云·微服务·云计算
老码沉思录2 天前
Android开发实战班 - 数据持久化 - Room 数据库应用
android·jvm·数据库
起名字真南2 天前
【C++】深入理解 C++ 中的继承进阶:多继承、菱形继承及其解决方案
java·jvm·c++·chatgpt·aigc