查找未使用的对象,释放内存,并压缩堆,避免内存碎片java
一个java程序,有执行应用程序逻辑的线程和执行GC的线程组。当GC跟踪对象引用,或在内存中移动对象,它必须确保应用程序线程没有使用这些对象。 尤为如此在GC移动对象:在该操做期间对象的内存位置发生变化,所以没有应用程序线程能够访问该对象。全部应用程序线程中止时的暂停叫作 stop-the-world 暂停.算法
全部GC算法在收集年轻代时都会 stop-the-world pauses服务器
随着对象被移动到老年代,最终它也将填满,JVM将须要在老年代中找到再也不使用的任何对象并丢弃它们。这是GC算法最大的区别。 这最简单算法是中止全部应用程序线程,找到未使用的对象并释放内存,而后压缩堆。此过程称为 full GC,它一般会致使应用程序线程的长暂停。并发
另外一方面,有可能 - 虽然计算复杂 - 找到不使用的对象在应用程序线程运行时; CMS和G1都采用这种方法。由于扫描未使用对象的阶段能够在不中止应用程序线程的状况下发生,CMS和G1称为并发收集器。 他们也是称为低暂停(有时是不正确的,没法暂停)的收集器,由于它们最小化须要中止全部应用程序线程。 并发收集器也有不一样压缩老年代的方法。线程
使用CMS或G1收集器时,应用程序一般会更少(和更短暂)停顿。 权衡是应用程序将使用更多的CPU对象
在任何状况下都须要权衡利弊。在测量单独响应时间的应用程序(如Java EE服务器)中,请考虑如下几点:内存
相似地,批处理应用程序中垃圾收集器的选择由如下指导权衡:io