垃圾收集器的操作

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

  • 一个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. java集合架构

     Collection接口  与  Map接口 1 .collection接口 特点:元素是 无序可重复的集合,无索引的,元素是单例值 子类 :set接口  list接口 1.1 set接口  特点: ...

  2. 关于如何使用xposed来hook某支付软件

    由于近期有业务上的需要,所以特地花时间去研究了一下如何使用hook技术.但是当我把xposed环境和程序编写完成时,突然发现手机上的某个支付软件无法使用了.这个时候我意识到,应该是该软件的安全机制在起 ...

  3. Redis保证事务一致性,以及常用的数据结构

    reids命令可以参考中文官网:http://redis.cn/commands.html 关于reids的使用,可以封装到工具类进行调用: Redis的工具类:JedisAdapter 除了数据结构 ...

  4. 与webview打交道踩过的坑

    随着HTML5被越来越多的用到web APP的开发当中,webview这一个神器便日渐凸显出重要地位.简要的说,webview能够在移动应用中开辟出一个窗口,在里面显示html页面,css以及js代码 ...

  5. Spring容器

    1.Spring简介: a)Spring春天 b)官网:https://spring.io c)设计理念:轮子理念,不要重复创造轮子: d)Spring可以被理解为一个容器,用于管理其他的框架: e) ...

  6. NFS 安装与配置

    NFS通常用于网络中的多台计算机实现共享存储. 由于测试环境没有购买阿里云的NFS,所以自己搭建一个NFS文件系统,实现一些比如上传图片,静态资源等同享功能. 下面的测试是在CentOS releas ...

  7. Django Linux环境下部署CentOS7+Python3+Django+uWSGI+Nginx(含Nginx返回400问题处理、防火墙管理)

    本文将介绍如何在Linux系统上部署Django web项目,本次部署基于下面的架构: CentOS7+ Python3.5 + Django1.11 + uWSGI + Nginx 亲测可行!!按照 ...

  8. 从0开始的Python学习002python的数据类型

    在创建变量的时候不用声明数据类型 # 创建变量 a = 10 # 打印变量值 print(a) 结果如下: 这种感觉和Java有很大的不同,感觉python很神奇,数据的类型是python自己决定的. ...

  9. C#微信支付对接

    c#版在pc端发起微信扫码支付   主要代码: /** * 生成直接支付url,支付url有效期为2小时,模式二 * @param productId 商品ID * @return 模式二URL */ ...

  10. Cs231n课堂内容记录-Lecture 4-Part2 神经网络

    Lecture 7 神经网络二 课程内容记录:https://zhuanlan.zhihu.com/p/21560667?refer=intelligentunit 1.协方差矩阵: 协方差(Cova ...