首页 > 编程语言 >垃圾回收算法-通用的分代垃圾回收机制

垃圾回收算法-通用的分代垃圾回收机制

时间:2023-12-30 17:23:11浏览次数:59  
标签:对象 回收 算法 分代 GC 垃圾 年老

垃圾回收算法-通用的分代垃圾回收机制

    概要

    分代垃圾回收机制,是基于这样一个事实:不同对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的回收算法,以便提高回收效率。

    我们将对象分为三种状态:年轻代、年老代、永久代。同时,将处于不同状态的对象放到堆中不同的区域。

    一、年轻代
    所有新生成的对象首先都是放在Eden区。年轻代的目标就是尽可能快速的收集到那些生命周期短的对象,对应的是Minor GC,每次Minor GC会清理年轻代的内存
算法用效率较高的复制算法,频发的操作,但是会浪费内存空间,当“年轻代”区域存放满对象后,就将对象存放到年老代区域。

   二、年老代
   在年轻代中经历了N(默认15)次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。年老代对象越来越
多,我们就需要启动Major GC和Full GC(全量回收),来一次大扫除,全面清理年轻代区域和年老代区域。

   三、永久代
   用于存放静态文件,如Java类、方法等。永久代对垃圾回收没有显著影响。JDK7以前就是“方法区”的一种实现。JDK8以后已经没有"永久代”了,使用metaspace
元数据空间和堆替代

  四、垃圾回收算法

   1.  Minor GC:
   用于清理年轻代区域。Eden区满了就会触发一次Minor GC。清理无用对象,将有用对象复制到"Survivor1”、"Survivor2”区中。

   2. Major GC:
  用于清理老年代区域。

   3. Full GC:
  用于清理年轻代、年老代区域。成本较高,会对系统性能产生影响。

   Eden区:存储了从未通过垃圾回收的新对象
   Survivor区:存放垃圾回收后,仍然有用的对象。循环存放,小于15次垃圾回收次数
   Tenured区:年老代区域存放超过15次垃圾回收的对象。

  五、JVM调优和Full GC

  在对M调优的过程中,很大一部分工作就是对于Full GC的调节。有如下原因可能导致Full GC:
  1.  年老代(Tenured)被写满
  2. 永久代(Perm)被写满
  3. System.gc()被显式调用(相当于建议,能不能被调用由系统决定)
  4. 上一次GC之后Heap的各域分配策略动态变化

 

标签:对象,回收,算法,分代,GC,垃圾,年老
From: https://www.cnblogs.com/hld123/p/17936556.html

相关文章

  • JVM 判断是否应该回收对象
    JVM内存中程序计数器、虚拟机栈、本地方法栈3 个区域随线程而生,随线程而灭。这几个区域不用考虑回收问题,因为方法结束后 或者 线程结束后,内存就跟着回收了。而Java堆和方法区不一样,一个接口的多个实现类需要的内存不一样,一个方法的多个分支需要的内存也可能不一样,我们只有在程......
  • JVM 的垃圾收集器
    JVM的垃圾收集器:Serial、ParNew、 ParallelScavenge、SerialOld、ParallelOld、CMS、G1。 1. 概述下图中垃圾收集器只要连线则表明垃圾收集器可以搭配使用。没有万能的收集器,具体应用选择合适的垃圾收集器。2. Serial垃圾收集器单线程收集器,用于新生代,这里的单线程指的......
  • 【GC】Java中常见的垃圾回收算法
    Java中常见的垃圾回收算法有以下几种:标记-清除算法(Mark-and-Sweep):该算法分为两个阶段,标记阶段和清除阶段。在标记阶段,垃圾回收器会遍历堆中的对象,并标记所有可达对象。在清除阶段,垃圾回收器会遍历堆中的对象,清除所有未被标记的对象。复制算法(Copying):该算法将堆分成两个区域......
  • 垃圾回收机制
    垃圾回收机制(GC)垃圾回收机制(简称GC)是Python解释器自带的一种机制专门用来回收不可用的变量值所占用的内存空间(在内存中,没有变量名指向的数据都是垃圾数据)(1)引用计数name='dhy'#'dhy'的引用计数就是1a=name#'dhy'的引用计数就是2(2)标记清除#一旦你的内存空间......
  • python 将文件移入回收站
     python如果要删除一个文件,通常使用os.remove(filename)但是这样就直接从磁盘删除了。有些文件需要删除到回收站,以便误删后还能找回文件fromwin32com.shellimportshell,shellcondebug=Falsedefdeltorecyclebin(filename):print('deltorecyclebin',filename)......
  • 2、jvm虚拟机垃圾回收机制
    一、首先了解一下堆栈内存1、jvm内存结构  从上图可以看出,整个JVM内存是由栈内存、堆内存和永久代构成。年轻代(Newgeneration)=eden+s0+s1堆内存=年轻代+老年代(Oldgeneration)JDK1.8以前: JVM内存=栈内存+堆内存+永久代JDK1.8以后: 由元空间取代了永久代,......
  • 垃圾回收机制
    一般说来,我们要解决三个问题:1、回收哪些内存?2、什么时候回收?3、如何回收?  首先我们来看Java的四种引用类型: 强引用:代码中普遍存在的,只要强引用还存在,垃圾收集器就不会回收掉被引用的对象。 软引用:SoftReference,软引用是介于强引用和弱引用之间的引用类型。当系统内......
  • c++智能指针和java垃圾回收对比
    c++智能指针和java垃圾回收对比我们都知道C++和java语言的一个巨大差异在于垃圾回收方面,这也是C++程序开发者和java程序开发者之间经常讨论的一个话题。在C++语言中,一般栈上的内存随着函数的生命周期自动进行回收,但是堆上内存(也就是自己new/malloc出来的空间),需要自己手动进行del......
  • JVM虚拟机系统性学习-JVM调优之通过gceasy分析GC日志对堆、元空间、线程堆栈和垃圾回
    通过gceasy工具对生成的GC日志进行分析这里使用的JDK版本为JDK8!在分析GC日志时,可以同时采用多种工具(Arthas、gceasy、JVM连接Graphana监控)进行分析,避免某种工具分析不准确gceasy每个月只可以免费分析5个gc日志,因此要节约机会!hhh!我们先将gc.log文件放入gceasy......
  • 4. 垃圾收集
    垃圾回收垃圾回收需要完成的三件事情哪些内存需要回收?什么时候回收?如何回收?1.如何判断对象是否存活在堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,首先就要确定对象的存活状态1.1对象存活算法1.1.1引用计数算法(ReferenceCounting)在对象......