垃圾收集器的操作

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

  • 一个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消耗将会增加 
      导致批处理作业需要更多时间。

Java垃圾收集器概述的更多相关文章

  1. Java垃圾收集器——Serial,Parallel,CMS,G1收集器概述

    1.概述 Java应用启动的时候,除了配置Xms以及Xmx参数(Xmx:InitialHeapSize, Xms:MaxHeapSize),还需要选择合适的垃圾收集器. 截止Jdk1.8,共提供了7款 ...

  2. 面试官,不要再问我“Java 垃圾收集器”了

    如果Java虚拟机中标记清除算法.标记整理算法.复制算法.分代算法这些属于GC收集算法中的方法论,那么"GC收集器"则是这些方法论的具体实现. 在面试过程中这个深度的问题涉及的比较 ...

  3. 面试官,不要再问我“Java 垃圾收集器”了(转载)

    如果Java虚拟机中标记清除算法.标记整理算法.复制算法.分代算法这些属于GC收集算法中的方法论,那么"GC收集器"则是这些方法论的具体实现. 在 面试过程中这个深度的问题涉及的比 ...

  4. Java类加载器概述

    Java类加载器概述 Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由Java 应用开发人员编写的. 系统提供的类加载器 引导类加载器 它用来加载 Java 的核心库,是用原生 ...

  5. Java垃圾收集器

    概述 说起垃圾收集(Garbage Collection,GC),大部分人都把这项技术当做Java语言的伴生产物.事实上,GC的历史远远比Java久远,1960年诞生于MIT的Lisp是第一门真正使用 ...

  6. 深入理解JVM : Java垃圾收集器

    如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现. Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同的厂商.不同版本的虚拟机所提供的垃圾收集器都可能会有很大差 ...

  7. 重读《深入理解Java虚拟机》二、Java如何分配和回收内存?Java垃圾收集器如何工作?

    线程私有的内存区域随用户线程的结束而回收,内存分配编译期已确定,内存分配和回收具有确定性.共享线程随虚拟机的启动.结束而建立和销毁,在运行期进行动态分配.垃圾收集器主要对共享内存区域(堆和方法区)进行 ...

  8. 理解JVM之垃圾收集器概述

    前言 很多人将垃圾收集(Garbage Collection)视为Java的伴生产物,实际1960年诞生的Lisp是第一门真正使用内存动态分配与垃圾手机技术的语言.在目前看来,内存的动态分配与内存回收 ...

  9. 【Java】JVM(三)、Java垃圾收集器

    一.Minor GC.Major GC 和 Full GC Minor GC:清理新生代空间,当Eden空间不能分配时候引发Minor GC Major GC:清理老年代空间 Full GC:清理Ja ...

随机推荐

  1. vue关闭代码检查eslint

    confing/index.js 文件里面的 useEslint 改成false就可以关闭代码检查了   不过为了代码的规范性,不建议关闭!

  2. WebGIS中以version方式实现代码更新后前端自动读取更新代码的方法

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1. 前言 GIS代码进行更新后,由于用户前端已有缓存,导致更新的功能不 ...

  3. Android学习笔记之SoftReference软引用,弱引用WeakReference

    SoftReference可以用于bitmap缓存 WeakReference 可以用于handler 非静态内部类和匿名内部类容易造成内存泄漏 private Handler mRemoteHand ...

  4. Idea软件中隐藏忽略.idea,.iml等文件

    参考链接,https://blog.csdn.net/fanrenxiang/article/details/80533950 ignore files and folders;增加隐藏的文件类型:

  5. Java新知识系列 八

    什么是死锁,死锁的原因和必要条件:       []什么是死锁,死锁的原因和必要条件: 死锁:死锁的原因在于进程在等待其它进程占有的某些资源,而自身的资源又被其它进程等待着,造成了死循环. 出现死锁的 ...

  6. C#如何生成JSON字符串提交给接口(服务器)

    C#如何生成JSON字符串提交给接口(服务器)   第一章:C#如何拿到从http上返回JSON数据? 第二章:C#如何解析JSON数据?(反序列化对象) 第三章:C#如何生成JSON字符串?(序列化 ...

  7. 数字信号处理专题(1)——DDS函数发生器环路Demo

    一.前言 会FPGA硬件描述语言.设计思想和接口协议,掌握些基本的算法是非常重要的,因此开设本专题探讨些基于AD DA数字信号处理系统的一些简单算法,在数字通信 信号分析与检测等领域都会或多或少有应用 ...

  8. 【idea】Springboot整合jpa

    第一步快速搭建springboot项目:在你建立的工程下创建 Module 选择Spring initializr创建. 第二步:修改包名.项目名.web项目打成war包.在Type处选择: Mave ...

  9. 日志学习系列(二)——Log4net的实例

    一.log4net简单实例创建步骤如下 1.第一步:在项目中添加对log4net.dll的引用,这里引用版本是2.0.8.0 2.第二步:程序启动时读取log4net的配置文件. 读取log4net的 ...

  10. IIS出现The specified module could not be found的解决方法

       1.打开IIS 信息服务,在左侧找到自己的计算机,点右键,选择属性,在主属性中选编辑,打开“目录安全性”选项卡,单击“匿名访问和验证控制”里的“编辑”按钮,在弹出的对话框中确保只选中了“匿名访问 ...