`

JVM垃圾回收机制(三)--如何回收

    博客分类:
  • JVM
 
阅读更多

1.3 如何回收

对于如何回收,这里就要说到虚拟机的算法实现了.我们常见的算法有Mark-Sweep,Mark-Compact,Copying,Generational Garbage Collection.

1.3.1 Mark-Sweep,标记-清除算法,按照字面过程,分为标记和清除两个过程.

标记过程就是标记哪些对象是在用的,哪些是不再被引用可以回收的.(见Marking)

清除过程就是将标记过的对象进行回收.(见Normal Deletion)

缺点:①Mark-Sweep算法效率不高②Mark-Sweep会产生不连续的内存碎片,当分配大对象的时候,若无法找到足够大的内存空间,不得不再进行一次垃圾回收.

直接上图,简单明了,一目了然.


 
 
 1.3.2 Mark-Compact,标记-整理紧凑算法(zzm的书上翻译的是标记整理算法,可能不是那么准确,Compact原意是使紧凑,我翻译成了整理紧凑更好些).

标记-整理紧凑算法的过程,标记跟1.3.1中的标记过程一样,整理紧凑(Compact)是在Sweep(清除)后进行一次整理紧凑处理,就是将原来不连续的内存碎片整理成紧凑型.

直接上图:


 

1.3.3 Generational Garbage Collection(分代收集算法)

因为要面对全体对象,因此,当对象数量很多时,标记和整理紧凑的效率并不高.随着越来越多的对象被分配,对象列表的增长导致更长的垃圾收集时间.

然而,通过应用程序的实证分析表明,大多数对象的存活时间是短暂的.见图


 

 

根据对象分配行为,我们可以将堆进行更小粒度的区分,将堆分为:新生代(Young Generation), 老年代(Old or Tenured Generation)和永久代( Permanent Generation).

又将新生代分为Eden区和Survivor的S0区和S1区,默认的内存空间比例为Eden:S0=8:1,我们也可以动态设置比例大小,设置方法:增加虚拟机参数,-XX:SurvivorRatio=8。


 

1.3.3.1新生代具体分配及回收过程如下:


 
 

①新对象分配的时候都会被分配到Eden区,而幸存区Survivor的两部分都是空的.每个新分配的对象都有一个"对象年龄计数器".


 

②当Eden区的空间被占用满后,将会触发一次minor garbage collection,简称minor GC.

③引用的对象(在使用中的)被移动到第一块幸存区(S0),存活年龄+1,不再引用的对象在Eden区清理(minor GC)的时候被清除.


 

④当Eden区再次被占满后,进行minor GC,此次GC会把Eden区和S0区的存活对象都移动到S1区,而Eden区和S0区的不再被引用的对象被清除.被移动到S1区的对象,对象年龄+1


 

⑤当下次Eden区再次被占满后,Eden区和S1进行minor GC,将存活对象移到S0区,对象存活年龄+1.


 

⑥当对象的存活年龄达到默认(默认为15,或配置的)的年龄阈值时,对象将进入老年代(Tenured Generation).虚拟机参数设置:-XX:MaxTenuringThreshold,规定进入老年代的年龄值大小.


 
 

 

这里要注意,以上规则只是一般情况.虚拟机提供了另外三种进入老年代的机制(动态年龄判定,大对象直接进入老年代,担保进入):

①动态年龄判定成功后,进入老年代:这里zzm的书上讲的很片面,并且容易误导别人,因此在这里重新阐述.

JVM会将每个对象的年龄信息、各个年龄段对象的总大小记录在"age table"表中.基于"age table",根据survivor区大小,survivor区目标使用率(-XX:TargetSurvivorRatio,-XX:TargetSurvivorRatio=50,设定survivor区的目标使用率,默认50,即survivor区对象目标使用率为50%),最大晋升年龄阈值(-XX:MaxTenuringThreshold),JVM会动态的计算tenuring threshold的值.一旦对象年龄达到了tenuring threshold就会晋升到老年代.计算公式为:size_t desired_survivor_size = (size_t)((((double) survivor_capacity)*TargetSurvivorRatio)/100);

源码位置:https://github.com/FlashLightNing/openjdk-notes/blob/master/src/share/vm/gc_implementation/shared/ageTable.cpp

第81行开始的uintageTable::compute_tenuring_threshold(size_t survivor_capacity)方法中.


 
 在源码中我们很容易知道动态年龄判断的标准,当某个age年龄段的对象大小及以下的年龄段所占总Survivor(S0区或者S1区)比例达到Survivor区目标使用率,就把此age年龄作为新的晋升阈值(TenuringThreshold),然后再与最大晋升年龄阈值比较,若age<MaxTenuringThreshold,则把age作为最终的晋升阈值,若不是,则以MaxTenuringThreshold作为最终晋升阈值.

 

②对象大小达到设定值进入老年代:规定在对象达到多大大小的时候,直接进入老年代.通过虚拟机参数设置进入老年代的对象大小:-XX:PretenureSizeThreshold=[byte size],这里的单位是字节,如512k,要写成512*1024=524288

③担保进入:当新生代中对象在经过n次minor GC后,依然无法满足对象的存储空间要求,那么就需要通过担保机制直接进入老年代.

担保机制过程:当进行minor GC前,虚拟机会检查老年代的空间是否大于新生代中所有对象空间,如果大于,默认minor GC是安全的,虚拟机会把minor GC后Survivor区无法容纳的对象通过担保机制移动到老年代.

如果不大于,虚拟机会检查设置的虚拟机参数-XX:HandlePromotionFailure的值.若为false,则表示不允许担保失败,老年代会进行一次major GC,清理出更多的空间.若为true,

表示允许担保失败,那么虚拟机会根据历次晋升到老年代的对象所占空间的平均值作为经验值,与老年代中剩余空间大小比较,决定是否再进行major GC.

 

 1.3.3.2老年代垃圾回收

老年代(Tenured Generation)采用标记-整理紧凑(Mark-Compact)算法实现垃圾回收.

 

 

  • 大小: 17.7 KB
  • 大小: 18.3 KB
  • 大小: 15.2 KB
  • 大小: 18.5 KB
  • 大小: 17.2 KB
  • 大小: 21.2 KB
  • 大小: 13.8 KB
  • 大小: 16.4 KB
  • 大小: 22.4 KB
  • 大小: 23.1 KB
  • 大小: 24.1 KB
  • 大小: 23.5 KB
  • 大小: 21.6 KB
分享到:
评论

相关推荐

    JVM垃圾回收机制.xmind

    自己学习总结JVM垃圾回收机制的结构图,一起分享!!!

    JVM垃圾回收机制

    我们通过深入探讨以下几个关键点来理解JVM垃圾回收机制的工作原理: 1. 如何确定某个对象是“垃圾”? JVM垃圾回收机制通过两种主要算法来确定对象是否成为垃圾,即“可达性分析算法”和“引用计数法”。 - 可达性...

    JVM垃圾回收机制与GC性能调优

    Java虚拟机(JVM)的垃圾回收(GC)机制是Java程序高效运行的关键部分,它自动管理内存,释放不再使用的对象以避免内存泄漏。本文主要探讨JVM堆内存的结构和GC的工作原理,以及如何进行性能调优。 JVM堆是Java应用...

    jvm内存模型以及垃圾回收机制.pptx

    Java虚拟机(JVM)内存模型和垃圾回收机制是Java开发中至关重要的概念。本文将深入探讨这两个主题,帮助理解JVM如何管理和优化内存。 **一、类加载器和双亲委派机制** 类加载器是JVM的一个组成部分,负责加载Java...

    JVM的工作原理及垃圾回收机制介绍

    ### JVM工作原理及垃圾回收机制详解 #### 一、JVM概述及原理 **1.1 JVM概述** Java Virtual Machine (JVM),即Java虚拟机,是一种虚构的计算机,在实际的计算机硬件上仿真模拟出的一套完整的计算机系统,用于执行...

    JVM的垃圾回收机制详解和调优

    理解并优化JVM的垃圾回收机制对于提升Java应用的性能至关重要。 一、垃圾回收的基本概念 1. 对象生命周期:当一个对象被创建后,它会经历新生、壮年、老年代等阶段。垃圾回收主要关注的是不再被引用的对象,即...

    jvm垃圾回收机制:.md

    全面概述jvm垃圾回收机制的功能、各部分组成及各部分算法实现

    jvm垃圾回收机制总结

    本文将深入探讨JVM的垃圾回收机制,包括其原理、类型以及在实际开发中的应用。 一、垃圾回收的原理 1. 对象引用计数:一种简单的垃圾回收策略,为每个对象分配一个引用计数器,当有引用指向该对象时,计数器加一,...

    JVM垃圾回收机制(GC).xmind

    JVM垃圾回收机制(GC).xmind

    16_Java高级_JVM垃圾回收机制.avi

    16_Java高级_JVM垃圾回收机制

    垃圾回收垃圾回收垃圾回收

    在Java编程语言中,垃圾回收(Garbage Collection, GC)是一项至关重要的机制,它自动管理程序中的内存,释放不再使用的对象所占据的空间,以防止内存泄漏。垃圾回收是Java虚拟机(JVM)的一个核心特性,它使得...

    JVM垃圾回收器和内存分配策略.zip

    本篇文章将深入探讨JVM的垃圾回收机制以及内存分配策略。 首先,我们需要了解JVM的内存模型。在Java中,内存主要分为堆(Heap)和栈(Stack)。堆是所有对象实例的存储区域,而栈则用于存储方法调用时的局部变量。...

    09 Java基础-JVM垃圾回收-玉峰1

    本节将深入探讨JVM垃圾回收机制以及与之相关的工具和概念。 1. **JVM内存模型** JVM内存分为堆内存和栈内存,其中堆内存主要用于存储对象实例,而栈内存则用于存储方法调用时的局部变量。堆内存又分为年轻代和老...

    Java+JVM+垃圾回收机制

    ### Java+JVM+垃圾回收机制 #### 一、哪些垃圾是需要回收的? 在Java虚拟机中,垃圾回收机制负责自动管理内存空间,确保不再使用的对象能够被及时释放,以便于新对象的分配。这一过程的核心在于识别哪些对象不再...

    JVM 垃圾回收(GC)

    理解JVM垃圾回收机制对于优化Java应用性能至关重要。 1. **垃圾回收的基本概念** - **对象生命周期**:在Java中,对象的生命周期包括创建、使用和销毁。当对象不再被引用时,就被认为是“垃圾”。 - **垃圾回收器...

    JVM垃圾回收机制(GC)

    JVM垃圾回收机制(GC) 引入:我们都知道,栈内存中方法运行完毕后会有弹栈的操作,不会产生垃圾,而堆内存中却没有这种操作,当堆内存中很多无用的成员变量、对象等等积压到一定程度时,就会发生堆内存溢出的一个错误...

    JVM历史发展和内存回收笔记

    本文将详细探讨JVM的发展历程以及内存管理中的垃圾回收机制。 一、JVM的历史发展 1. **早期阶段**:1995年,Sun Microsystems发布了Java的第一个版本,JVM作为其核心组成部分,主要应用于嵌入式设备和网络应用。初...

    java高级之垃圾回收机制

    其中,垃圾回收机制(Garbage Collection, GC)是Java虚拟机(JVM)的一项重要特性,它能够自动检测并回收不再使用的对象占用的内存空间,从而有效避免了内存泄漏问题。本文将详细介绍Java中的垃圾回收机制及其工作原理...

    7种JVM垃圾收集器特点-优劣势-及使用场景.pdf

    JVM垃圾收集器是Java虚拟机(JVM)中的一种自动内存管理机制,负责回收Java程序中不再使用的对象,以避免内存泄漏和提高程序性能。Java中有多种垃圾收集器,每种垃圾收集器都有其特点、优劣势和使用场景。 1. ...

Global site tag (gtag.js) - Google Analytics