【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.缺点是效率较低,因为需要额外的整理操作。
相关推荐
流星5211221 天前
GC 如何判断对象该回收?从可达性分析到回收时机的关键逻辑
java·jvm·笔记·学习·算法
JanelSirry1 天前
我的应用 Full GC 频繁,怎么优化?
jvm
JH30731 天前
jvm,tomcat,spring的bean容器,三者的关系
jvm·spring·tomcat
DKPT1 天前
JVM直接内存和堆内存比例如何设置?
java·jvm·笔记·学习·spring
siriuuus1 天前
JVM 垃圾收集器相关知识总结
java·jvm
小满、1 天前
什么是栈?深入理解 JVM 中的栈结构
java·jvm·1024程序员节
百花~2 天前
JVM(Java虚拟机)~
java·开发语言·jvm
每天进步一点点dlb2 天前
JVM中的垃圾回收算法和垃圾回收器
jvm·算法
漫漫不慢.2 天前
蓝桥杯-16955 岁月流转
java·jvm·蓝桥杯
boy快快长大3 天前
【JVM】线上JVM堆内存报警,占用超90%
jvm