Java垃圾收集器概述

垃圾收集器的操做

  • 查找未使用的对象,释放内存,并压缩堆,避免内存碎片java

  • 一个java程序,有执行应用程序逻辑的线程和执行GC的线程组。当GC跟踪对象引用,或在内存中移动对象,它必须确保应用程序线程没有使用这些对象。 尤为如此在GC移动对象:在该操做期间对象的内存位置发生变化,所以没有应用程序线程能够访问该对象。全部应用程序线程中止时的暂停叫作 stop-the-world 暂停.算法

Generational Garbage Collectors(分代垃圾收集器)

  • 尽管细节有所不一样,但全部垃圾收集器都经过拆分堆为不一样的代来工做。这些被称为老年代,和年轻代。年轻代进一步分为eden、survivor。划分年轻代的基本原理是:许多对象被使用很是短的时间。

minor GC

  • 当年轻代内存满时,垃圾收集器将中止全部应用程序线程并清空 
    年轻代。 丢弃再也不使用的对象,仍在使用的对象被转移到survivor之一或者老年代。

优势:

  • 由于年轻代只是整个堆的一部分,处理它比处理整个堆更快
  • 因为移动了全部幸存对象到survivor之一或者老年代,所以年轻代自动的在收集时压缩。

全部GC算法在收集年轻代时都会 stop-the-world pauses服务器

full GC

  • 随着对象被移动到老年代,最终它也将填满,JVM将须要在老年代中找到再也不使用的任何对象并丢弃它们。这是GC算法最大的区别。 这最简单算法是中止全部应用程序线程,找到未使用的对象并释放内存,而后压缩堆。此过程称为 full GC,它一般会致使应用程序线程的长暂停。并发

  • 另外一方面,有可能 - 虽然计算复杂 - 找到不使用的对象在应用程序线程运行时; CMS和G1都采用这种方法。由于扫描未使用对象的阶段能够在不中止应用程序线程的状况下发生,CMS和G1称为并发收集器。 他们也是称为低暂停(有时是不正确的,没法暂停)的收集器,由于它们最小化须要中止全部应用程序线程。 并发收集器也有不一样压缩老年代的方法。线程

  • 使用CMS或G1收集器时,应用程序一般会更少(和更短暂)停顿。 权衡是应用程序将使用更多的CPU对象

  • 在任何状况下都须要权衡利弊。在测量单独响应时间的应用程序(如Java EE服务器)中,请考虑如下几点:内存

    • 个别请求将受到暂停时间的影响 - 更重要的是对于 full GC,须要很长的暂停时间。 若是最小化暂停对响应的影响时间是目标,并发收集器将更合适。
    • 若是平均响应时间比异常值更重要(即90%响应时间),吞吐量收集器一般会产生更好的结果。
    • 使用并发收集器避免长时间停顿的好处来自于额外的CPU使用费用。
  • 相似地,批处理应用程序中垃圾收集器的选择由如下指导权衡:io

    • 若是有足够的CPU可用,则使用并发收集器以免full GC暂停将使工做更快完成。
    • 若是CPU受限,则并发收集器的额外CPU消耗将会增长 致使批处理做业须要更多时间。
相关文章
相关标签/搜索