• 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使用费用。
    • 类似地,批处理应用程序中垃圾收集器的选择由以下指导权衡:

      • 如果有足够的CPU可用,则使用并发收集器以避免full GC暂停将使工作更快完成。
      • 如果CPU受限,则并发收集器的额外CPU消耗将会增加 
        导致批处理作业需要更多时间。
  • 相关阅读:
    使用XMLReader读XML
    C#命名空间大全详细教程
    C# using 三种使用方式
    SVN服务器搭建
    简单的自定义Session
    python学习第十八天 --错误&异常处理
    锁的等级:方法锁、实例锁、类锁
    java线程池如何合理的设置大小
    挖掘两个Integer对象的swap的内幕
    实现线程同步的方式
  • 原文地址:https://www.cnblogs.com/parkdifferent/p/9520514.html
Copyright © 2020-2023  润新知