关闭

JVM-典型的垃圾收集器

197人阅读 评论(0) 收藏 举报
分类:
从前面的博客知道,类实例化产生的对象在堆区中存储,而堆区不可能无限大,因此需要有垃圾收集器。JVM的垃圾收集器干两件事:
1 碎片整理:整理内存碎片
2 垃圾回收:以某种算法发现垃圾,并使用某种算法清除垃圾。


JVM常见的垃圾发现算法包括引用计数和追踪。其中,引用计数就是为每个对象维护一个数字,这个数字记录了当前对象被引用的次数。当这个数字变为0的时候,说明该对象可以被垃圾回收了。但是引用计数无法发现那些循环引用的垃圾对象,比如垃圾对象a和垃圾对象b,两者互相引用,这个时候,虽然他们都是垃圾,但由于引用计算都是1,因此无法被发现。
此时,可以使用追踪算法,JVM会维护一个从根节点开始的对象引用图,当需要垃圾收集的时候,会从根节点开始追踪。能追踪到的对象会被打上标记。当追踪结束的时候,还没有被标记的对象可以被回收。

下面介绍一个典型的分代垃圾收集算法:
在这种垃圾收集机制下,jvm的堆区被分为young代,old代和永久代。这里主要讨论young代和old代。如图所示:(年轻代包括Eden,和Survivor0,survivor1)





当对象创建的时候,首先被放到Eden中(很大的对象有可能直接到old中),随着不断有对象被放入,当Eden满的时候,就会发生一次minor gc.在垃圾回收之前,JVM会使用垃圾发现算法,发现那些活着的对象(young代中活着的对象很少),然后将他们复制到S0区(如果S0放不下,会放到old代中),接着将Eden清空。

当再有对象被创建的时候,会放到Eden区中(很大的对象有可能直接到old中),当Eden满的时候,会发生一次minor gc.在垃圾回收之前,JVM会找出Eden和S0中活着的对象,然后将他们复制到S1中(如果S1放不下,会放到old代中),接着清空Eden和S0.

当再有对象被创建的时候,会放到Eden区中(很大的对象有可能直接到old中),当Eden满的时候,会发生一次minor gc.在垃圾回收之前,JVM会找出Eden和S1中活着的对象,然后将他们复制到S0中(如果S0放不下,会放到old代中),接着清空Eden和S1.

大家会发现,S0和S1中总有一个是空着的。当一个对象经历了多次gc(达到一定的阈值)仍然活着的时候,JVM就会考虑把他们放到old代中去。

我们需要做的就是使JVM尽可能少的发生old代的full gc.适当的发生young代的minor gc.因为在young中活着的对象很少,在gc前需要复制的对象很少。而在old中活着的对象很多,在gc前需要复制的对象很多,因此full gc会影响性能。
  • 大小: 38.4 KB
  • 大小: 6.8 KB
0
0
查看评论

JVM-垃圾收集器

通过学习了解到现在商用的JVM中的垃圾收集采用的是分带收集算法,那么针对不同年代采用了不同的收集算法,从而在JVM发展的过程中,就产生了不同的垃圾收集器,一般分为新生代收集器和老年代收集器,两者相互组合进行GC操作(下图中相连的垃圾收集器表示可以相互组合,注意Serial Old和CMS也可以联合进...
  • u012909091
  • u012909091
  • 2016-01-31 15:25
  • 2068

jvm-垃圾收集器

一、Serial收集器 1、虚拟机新生代收集的唯一选择。(client端) 2、单线程。 3、简单高效。 二、ParNew收集器 1、Serial的多线程版本 2、唯一能和CMS收集器配合使用。
  • adolph_jun
  • adolph_jun
  • 2017-11-29 08:41
  • 19

JVM-垃圾收集器与内存分配策略

1.叙述的问题 对象什么时候死亡? 垃圾收集算法 垃圾收集器 内存分配与回收策略2.GC需要完成的三件事: 哪些内存需要回收? 什么时候回收? 怎么回收?1)判断对象死亡的方法: 引用计数器算法:给对象中添加一个计数器,每当有一个地方引用它时,计数器加1;当引用失效时,计数器减1;任...
  • u011102153
  • u011102153
  • 2015-08-16 10:34
  • 676

JVM-垃圾收集器参数

此处参数主要依据JDK1.7。整理遇见的垃圾收集器参数。
  • No_Endless
  • No_Endless
  • 2016-11-17 12:00
  • 239

深入JVM-垃圾收集器常用的GC参数

1.与串行回收器相关的参数 -XX:+UseSerialGC:在新生代和老年代使用串行收集器 -XX:SurvivorRatio:设置eden区大小和survivor区大小的比例 -XX:PretenureSizeThreshold:设置大对象直接进入老年代的阈值。当对象的大小超过这个值时,将直接在...
  • nuaazhaofeng
  • nuaazhaofeng
  • 2016-12-11 21:33
  • 271

垃圾收集器的种类及原理

1、Serial收集器:古老的单线程收集器,作用于新生代。单线程的意义并非仅仅是只使用一条线程进行垃圾回收,更重要的是,在进行垃圾回收的时候,必须暂停其他所有的工作线程,因此,用户体验很不好。单实际上,Serial并不是一个一无是处的垃圾收集器,当虚拟机运行在Client模式下,Serial仍然是C...
  • yanqiaoli
  • yanqiaoli
  • 2017-03-17 17:09
  • 531

JVM笔记3:Java垃圾收集算法与垃圾收集器

当前商业虚拟机的垃圾收集都采用“分代收集”算法,即根据对象生命周期的不同,将内存划分几块,一般为新生代和老年代,不同的代根据其特点使用不同的垃圾收集算法,主要的垃圾回收算法有:一,标记-清除算法 二,标记-整理算法 三,复制算法 同时JVM内含很多垃圾收集器以供使用,不同的收集器将使用不同的回收算法...
  • a19881029
  • a19881029
  • 2013-10-22 09:37
  • 2898

Java虚拟机七种垃圾收集器比较

1、Serial收集器曾经是虚拟机新生代收集的唯一选择,是一个单线程的收集器,在进行收集垃圾时,必须stop the world,它是虚拟机运行在Client模式下的默认新生代收集器。 2、Serial Old是Serial收集器的老年代版本,同样是单线程收集器,使用标记整理算法。 3、ParN...
  • lingzhm
  • lingzhm
  • 2015-07-31 20:05
  • 1982

就那么几种垃圾收集器

1. Serial收集器     Serial收集器是JAVA虚拟机中最基本、历史最悠久的收集器,在JDK 1.3.1之前是JAVA虚拟机新生代收集的唯一选择。Serial收集器是一个单线程的收集器,但它的“单线程”的意义并不仅仅是说明它只会使用一个CPU或一条收...
  • u013782203
  • u013782203
  • 2016-08-16 16:51
  • 2324

深入理解JVM之四:详解垃圾收集器

前言前面已经对垃圾收集算法有了较为详细的介绍,这里我们将对JVM中具体的垃圾回收器进行介绍,在虚拟机规范中并没有对垃圾回收器如何实现具体介绍,因此每个厂商的垃圾回收器可能会完全不同,但是我们介绍的是基于JDK1.7之后的Hotspot虚拟机(包括前面对Java虚拟机的介绍也是基于jdk1.7版本的)...
  • u011116672
  • u011116672
  • 2016-03-27 21:39
  • 2359
    个人资料
    • 访问:151350次
    • 积分:1781
    • 等级:
    • 排名:千里之外
    • 原创:138篇
    • 转载:11篇
    • 译文:0篇
    • 评论:39条
    最新评论