分代回收机制

原创 2016年05月31日 15:29:23
  • 分代收集算法是目前大部分JVM的垃圾收集器采用的算法。它的核心思想是根据对象存活的生命周期将内存划分为若干个不同的区域。一般情况下将堆区划分为老年代(Tenured Generation)和新生代(Young Generation),老年代的特点是每次垃圾收集时只有少量对象需要被回收,而新生代的特点是每次垃圾回收时都有大量的对象需要被回收,那么就可以根据不同代的特点采取最适合的收集算法。
  • 目前大部分垃圾收集器对于新生代都采取Copying算法,因为新生代中每次垃圾回收都要回收大部分对象,也就是说需要复制的操作次数较少,但是实际中并不是按照1:1的比例来划分新生代的空间的,一般来说是将新生代划分为一块较大的Eden空间和两块较小的Survivor空间(大小8:1),每次使用Eden空间和其中的一块Survivor空间,当进行回收时,将Eden和Survivor中还存活的对象复制到另一块Survivor空间中,然后清理掉Eden和刚才使用过的Survivor空间。
  • 所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。年轻代分三个区。一个Eden区,两个 Survivor区(一般而言)。大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这个 Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当这个Survivor去也满了的时候,从第一个Survivor区复制过来的并且此时还存活的对象,将被复制“年老区(Tenured)”。需要注意,Survivor的两个区是对称的,没先后关系,所以同一个区中可能同时存在从Eden复制过来对象,和从前一个Survivor复制过来的对象,而复制到年老区的只有从第一个Survivor去过来的对象。而且,Survivor区总有一个是空的。同时,根据程序需要,Survivor区是可以配置为多个的(多于两个),这样可以增加对象在年轻代中的存在时间,减少被放到年老代的可能。
  • 新生代使用复制算法,当Minor GC时如果存活对象过多,无法完全放入Survivor区,就会向老年代借用内存存放对象,以完成Minor GC。在触发Minor GC时,虚拟机会先检测之前GC时租借的老年代内存的平均大小是否大于老年代的剩余内存,如果大于,则将Minor GC变为一次Major GC,如果小于,则查看虚拟机是否允许担保失败,如果允许担保失败,则只执行一次Minor GC,否则也要将Minor GC变为一次Major GC。说白了,新生代放不下就会借用老年代的空间来进行GC。
    当对象在新生代躲过一次Minor GC的话,其对象年龄便会加1,默认情况下,如果对象年龄达到15岁,就会移动到老年代中;一般来说,大对象会被直接分配到老年代,所谓的大对象是指需要大量连续存储空间的对象,最常见的一种大对象就是大数组或者长字符串。
  • 而由于老年代的特点是每次回收都只回收少量对象,一般使用的是Mark-Compact算法。注意,在堆区之外还有一个代就是永久代(Permanet Generation或者说新的metaspace),它用来存储class类、常量、方法描述等。对永久代的回收主要回收两部分内容:废弃常量和无用的类。
  • 严格说,full gc 不等于 minor GC + major GC,这三者是三个不同的概念
    minor gc在新生代
    major gc在老生代,有时也伴随着至少一次minor gc
    full gc在整个heap上(甚至包括永生代,或者说新的metaspace)有时也被定义和major gc一样

jvm分代回收机制

虚拟机中的共划分为三个代:年轻代(Young Generation)、年老点(Old Generation)和持久代(Permanent Generation)。其中持久代主要存放的是Java类的类信...
  • huangzhaoyang2009
  • huangzhaoyang2009
  • 2013年09月21日 10:05
  • 1748

Java垃圾回收算法以及分代回收机制

java垃圾回收算法实现原理,有两种,一个是引用计数法,一个是引用可达法。 引用计数法,每个对象有一个专门的空间维护一个引用计数器,当该对象被引用时,计数器加一,引用消失时则计数器减一,当该对象引用...
  • u012091092
  • u012091092
  • 2017年02月23日 13:06
  • 522

JVM-GC总结-分代垃圾回收详解--第一发

为什么要分代分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率。 在Java程序运行的过程中,会产生大量的对象,...
  • lucas421634258
  • lucas421634258
  • 2015年04月23日 11:05
  • 2128

Java垃圾回收-分代收集

Java自动垃圾回收(Automatic Garbage Collection)是自动回收堆上不再使用的内存,new的对象在程序中没有引用指向它,就不会被回收。回收的实现很多,有Reference C...
  • whuqin
  • whuqin
  • 2015年02月15日 19:15
  • 2232

垃圾回收算法之分代回收算法

当前商业虚拟机基本上都是采用分代垃圾回收算法来回收垃圾,思想也很简单,就是根据对象的生命周期将内存划分,然后进行分区管理。在Java虚拟机分代垃圾回收机制中,应用程序可用的堆空间可以分为年轻代与老年代...
  • sinat_36246371
  • sinat_36246371
  • 2016年11月01日 20:23
  • 2249

深入了解.net垃圾回收机制之代龄与算法详解

一、代龄(Generation)   代龄就是对Heap中的对象按照存在时间长短进行分代,最短的分在第0代,最长的分在第2代,第2代中的对象往往是比较大的。Generation的层级与Fra...
  • superhoy
  • superhoy
  • 2013年01月29日 17:16
  • 937

erlang 垃圾回收

Erlang垃圾回收特点: 1.  以进程为单位进行垃圾回收,GC时会导致进程挂起 2.  ETS和原子不参与垃圾回收 Erlang垃圾回收采用分代复制回收的方式,分代回收是基于统计学原理,多数...
  • jiefengchen
  • jiefengchen
  • 2016年05月16日 19:32
  • 254

简介三种垃圾回收机制:分代复制垃圾回收,标记垃圾回收,增量垃圾回收

一、分代复制垃圾回收 不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率。 在Java程序运行的过程中,会产生大量的对象,其中有些对象是与业务信息相关,比...
  • Java_Grass
  • Java_Grass
  • 2017年03月17日 13:52
  • 1657

.NET 分代垃圾回收

.NET框架包含一个托管堆,所有的.NET语言在分配引用类型对象时都要使用它。像值类型这样的轻量级对象始终分配在栈中,但是所有的类实例和数组都被生成在一个内存池中,这个内存池就是托管堆。 .NET框...
  • formiss
  • formiss
  • 2013年01月16日 10:56
  • 1023

JVM内存模型及垃圾回收机制

JVM内存模型 1、栈 Java栈是与每一个线程关联的,JVM在创建每一个线程的时候,会分配一定的栈空间给线程。存储局部变量、引用、方法、返回值等。 StackOverflowError:如果在线程执...
  • zhangpengju999
  • zhangpengju999
  • 2013年09月17日 15:22
  • 14522
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:分代回收机制
举报原因:
原因补充:

(最多只允许输入30个字)