天天看点

JVM 内存模型和垃圾回收(二): 串行垃圾回收器

JVM 内存模型和垃圾回收(二): 串行垃圾回收器

Java HotSpot VM包括三种类型的垃圾回收器,分别有各自不同的特点.

  • 串行回收(Serial GC)

    串行回收是指使用单线程的方式进行垃圾回收。适合于单个cpu线程的机器,但也可以用于多线程cpu的机器应用内存最大在100M以下的应用。可以根据操作系统配置自动选择,或者明确指定

    --XX:+UseSerialGC

  • 并行回收(Parallel GC)

    并行回收(也被称为throughput collector)在执行minor collections并行回收,并且中间还会涉及到并行聚合。适合中等应用,这个会在接下来具体解释。

  • 并发回收(Concurrent Mark and Sweep, 简称CMS)

    这里oralce的定义是在并行地进行垃圾回收(比如应用也一直运行),尽可能使暂停的时间很短。这个主要可以用于对反应时间要求很高的应用.这个解析来具体解释.

串行回收的特点:

With the serial collector, both young and old collections are done serially (using a single CPU), in a stop-theworld

fashion. That is, application execution is halted while collection is taking place

使用串行回收,young和old的内存都会串行的

stop-the-world

的方式进行回收。当进行回收的时候需要全面停止应用

  1. 对young generation回收动作
    • 首先拷贝Eden中存活的到empty的survivor空间,如果object太大,那么会直接进old generation
    • 接下来非empty中存活的对象需要进行判断,如果不够old,那么也拷贝到刚才的empty空间,否则拷贝到old空间。如果刚才empty的survivor空间不够使用,那么也是直接进入old generation
    • 接下来交换两个survivor的角色。
  2. 对old generation的回收动作

    old generation是通过

    mark-sweep-compact

    的算法进行回收的。 在mark阶段, 回收器判断哪些是存活的,sweep阶段判断是回收垃圾,compact阶段是进行内存偏移(应该说是整理,类似磁盘的碎片整理), 允许以后再使用的时候可以分配到比较大的内存,并且可以使用bump-the-pointer的技术进行分配内存。