background image

  该算法的提出是为了克服句柄的开销和解决堆碎片的垃圾回收。它开始时把堆分成 

 

一个对象 面和多个空闲面,程序从对象面为对象分配空间,当对象满了,基于 coping 算

 

法的垃圾 收集就从根集中扫描活动对象,并将每个活动对象复制到空闲面(使得活动对
象所占的内存之间没有空闲洞),这样空闲面变成了对象面,原来的对象面变成了空闲面,
程序会在新的对象面中分配内存。

  一种典型的基于 coping 算法的垃圾回收是 stop-and-copy 算法,它将堆分成对象面和
空闲区域面,在对象面与空闲区域面的切换过程中,程序暂停执行。

  5、generation 算法(Generational Collector)

  stop-and-copy 垃圾收集器的一个缺陷是收集器必须复制所有的活动对象,这增加了
程序等待时间,这是 coping 算法低效的原因。在程序设计中有这样的规律:多数对象存在
的时间比较短,少数的存在时间比较长。因此,generation 算法将堆分成两个或多个,每

 

个子堆作为对象的一代 (generation)。由于多数对象存在的时间比较短,随着程序丢弃不使
用的对象,垃圾收集器将从最年轻的子堆中收集这些对象。在分代式的垃圾收集器运行后,
上次运行存活下来的对象移到下一最高代的子堆中,由于老一代的子堆不会经常被回收,
因而节省了时间。

  6、adaptive 算法(Adaptive Collector)

  在特定的情况下,一些垃圾收集算法会优于其它算法。基于 Adaptive 算法的垃圾收集
器就是监控当前堆的使用情况,并将选择适当算法的垃圾收集器。

透视 Java 垃圾回收

  1、命令行参数透视垃圾收集器的运行

  2、使用 System.gc()可以不管 JVM 使用的是哪一种垃圾回收的算法,都可以请求 Java
的垃圾回收。在命令行中有一个参数-verbosegc 可以查看 Java 使用的堆内存的情况,它的
格式如下:

  java -verbosegc classfile

  可以看个例子: