GC解释:收集器概述

当前版本的HotSpot JVM包括三种类型的垃圾收集器:

–串行收集器

–并行收集器

–多数同时收集者

它们都是世代的,这意味着它们利用了堆的划分方式 。

垃圾收集器负责三个主要操作:

–查找不再使用的对象

–释放这些对象之后的内存

–压缩堆

并非所有收集器都以相同的方式执行这些操作,因此让我们了解有关所有收集器的基本信息。 我们将在单独的文章中介绍细节。

串行收集器

顾名思义,该收集仅由一个线程执行。 在次要和完全GC期间都必须停止世界(STW)。

该收集器对年轻一代使用标记复制算法,而对老一代则使用标记清除紧凑算法进行清理。

串行GC专为单线程环境(通常是客户端类计算机)和较小的堆而设计。 可以通过-XX:+UseSerialGC标志启用它。

并行(吞吐量)收集器

Young集合由多个线程并行化,这使Minor GC更快。 结果,此收集器导致较短但更频繁的Young收集STW暂停。 从JDK 7u4开始,默认情况下还会由多个线程收集“旧世代”(并且还会导致世界停顿)。 在JDK 7u4之前,需要-XX:+UseParallelOldGC标志来启用旧一代的并行处理。 现在, -XX:+UseParallelGC-XX:+UseParallelOldGC标志都启用了吞吐量收集器,并同时处理了老一代和年轻一代。

该收集器还在Young Generation中使用mark-copy算法,在Old Generation中使用mark-sweep-compact,但是复制和压缩阶段均由多个线程执行。

要配置GC线程数,可以使用-XX:ParallelGCThreads=X标志。 默认值设置为CPU内核数。

什么时候使用并行GC是个不错的选择? 好吧,基本上,只要吞吐量比延迟更重要。

大多数同时收集者

它们被称为低暂停收集器-旨在最大程度地减少停顿的暂停并保持应用程序尽可能的响应

并发标记和扫描(CMS)

使用并行标记复制算法在多个线程中执行次要GC。 然后将停止所有应用程序线程。 老式服务器通常是同时收集的-当后台GC线程扫描老式服务器时,应用程序线程会暂停很短的时间。 Major GC期间使用的实际算法是并发标记扫描。 您可能已经注意到,“扫描”之后没有“压缩”。 没错–并发标记和清除是不会压缩使用权空间的收集器,因此内存可能会碎片化。 由于缺乏堆压缩,当GC无法将新对象放入内存时,JVM会回退到串行mark-sweep-compact算法以对旧一代进行碎片整理和压缩。 那就是性能下降的时候–所有应用程序线程都停止了,只有一个线程负责清理和压缩Tenured空间。

如前所述,CMS是低暂停收集器的一个示例。 这意味着当延迟是主要目标而不是吞吐量时,这是一个不错的选择-因为吞吐量可能由于CPU消耗的增加而降低(在应用程序线程运行时扫描堆不是免费的)。

-XX:+UseConcMarkSweepGC启用CMS收集器。 过去可以使用-XX:-UseParNewGC (单号“ UseParNewGC”之前的负号,因此使用此标志将禁用Parallel New(Young)GC)来配置具有单线程Young Generation集合的CMS,但已弃用在Java 8中已删除,在Java 9中已删除。

G1GC

垃圾优先(G1)是一种新的低中断垃圾收集器,旨在以最小的暂停处理大型堆。 堆分为固定大小的几个区域(同时仍保持堆的世代性质)。 这种设计使我们可以在处理整个“年轻一代”或“老一代”时摆脱长时间的STW暂停。 现在,可以分别收集每个区域,这将导致STW停顿时间更短但更频繁。 G1将对象从一个区域复制到另一个区域,这意味着堆至少已部分压缩。

G1使用mark-sweep-compact算法的增量版本。 可以通过指定-XX:+UseG1GC标志来启用它。

摘要

这是本文讨论的收集器的简单比较:

集电极 多个GC线程 STW(年轻一代) STW(老一代) 堆压实 首要目标
序列号 没有
平行 通量
内容管理系统 仅在扫描期间 没有 潜伏
G1 很短的 部分地 潜伏

还有一些其他垃圾收集器,但它们不是HotSpot JVM的一部分。 这些是:

  • C4(Azul Zing JVM)
  • 雪兰多
  • 平衡(IBM J9 JVM)

在Java 8中,服务器级计算机的默认GC是Parallel Collector。 G1GC在Java 9中将是默认的。默认情况下,客户端类计算机运行Serial Collector。

翻译自: https://www.javacodegeeks.com/2017/09/gc-explained-collectors-overview.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349720.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构之排序五:选择排序

def selectedSort(myList):#获取list的长度length len(myList)#一共进行多少轮比较for i in range(0,length-1):#默认设置最小值得index为当前值smallest i#用当先最小index的值分别与后面的值进行比较,以便获取最小indexfor j in range(i1,length):#如果找到比当前值小的ind…

C#代码规范

1. 引言 本文是一套面向C# programmer 和C# developer 进行开发所应遵循的开发规范。 按照此规范来开发C#程序可带来以下益处: 代码的编写保持一致性, 提高代码的可读性和可维护性, 在团队开发一个项目的情况下&a…

谷歌guava_使用Google Guava进行馆藏创建和不变性

谷歌guava因此,我想看看番石榴提供的一些集合创建模式,以及它提供的某些不可变集合类型。 如果您没有看过我以前的文章,则可能要从这里开始: 番石榴第1部分– MultiMaps 番石榴第2部分– BiMaps 番石榴第3部分–多组 Guava的…

问题 1051: [编程入门]结构体之成绩统计2

题目描述有N个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输入N个学生的数据,要求打印出3门课的总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课成绩)输入学生数量N占一行每个学生的…

socket-02

# -- coding: utf-8 --_author__ "HuaQiang Yan" import socketdef handle_request(client):buf client.recv(1024) # 接收请求client.send(bytes("HTTP/1.1 200 OK\r\n\r\n", encodingutf-8))client.send(bytes("Hello World!", …

jenkins复制作业_Jenkins分层作业和作业状态汇总

jenkins复制作业您可能知道,Jenkins是高度可配置的CI服务器。 我们可以设置不同的自定义构建过程。 我将分享一些我用来设置詹金斯工作层次的方法。 这是用例: 我们有一个主要的入口工作被调用以启动整个构建过程。 这项工作可以有一个到多个子工作。 …

xaml语言建立首个win8 Metro应用,rss阅读器

本实例是来源msdn的Metro开发文档,按着解说一步步来理解的,修改了一点点,拿了博客园本人的博客作为RSS阅读,本实例用来学习还是可以的 参考文档http://msdn.microsoft.com/zh-cn/library/windows/apps/br211380.aspx#Y909 先看允…

在扩展Spock时输出给定值

Spock是一个Java测试框架,由GradleWare的软件工程师Peter Niederwieser于2008年创建,它可以促进BDD的发展。 利用这个 例如 ,一个故事可以定义为: Story: Returns go to stockAs a store owner In order to keep track of stock…

wsgi

wsgi,通用网关接口。相当于在app与web服务(socket服务端)之间建立统一连接的规范。 真实开发中的python web程序来说,一般会分为两部分:服务器程序和应用程序。服务器程序负责对socket服务器进行封装,并在请…

Java与Python:哪一种最适合您? [信息图]

通过从应用程序中学习企业APM产品,发现更快,更高效的性能监控。 参加AppDynamics APM导览! 在软件开发中,很少有问题比选择编程语言更具分裂性或部落性。 软件开发人员经常以自己选择的工具来强烈地认同自己,将客观事…

零基础学习java------day11------常用API

API概述 API(application Programming Interface, 应用程序编程接口),是一些预先定义的函数。目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节 比如我需要在一个程序里面嵌入…

.net 下的集合

集合的操作在编码的时候很常见。但是由于经常使用几种集合。而忽略了一些不常用的集合。在这里我整理下。 首先先了解下接口&#xff1a; 1、IEnumerable&#xff0c;返回一个循环访问集合的枚举器。 2、IEnumerable<T>&#xff0c;返回一个循环访问指定集合T的枚举器。 …

aspects_具有Aspects的Java中的Mixin –用于Scala特性示例

aspectsScala特征允许将新行为混合到一个类中。 考虑两个特征&#xff0c;可以向JPA实体添加审核和与版本相关的字段&#xff1a; package mvcsample.domainimport javax.persistence.Version import scala.reflect.BeanProperty import java.util.Datetrait Versionable {Ver…

TCP服务端实现并发

socket 在 tcp 协议下通信 客户端 import socket ​ # 创建客户端TCP协议通信 c socket.socket() # 与指定服务端握手 c.connect((127.0.0.1, 8080)) ​ # 通信循环 while True:# 向服务端发送信息msg input(>>>)if len(msg) 0:continuec.send(msg.encode(utf-8))#…

问题 1052: [编程入门]链表合并

题目描述已有a、b两个链表&#xff0c;每个链表中的结点包括学号、成绩。要求把两个链表合并&#xff0c;按学号升序排列。 输入第一行&#xff0c;a、b两个链表元素的数量N、M,用空格隔开。 接下来N行是a的数据 然后M行是b的数据 每行数据由学号和成绩两部分组成 输出按照学号…

ssh 看apache_使用Apache KeyedObjectPool的ssh连接池

ssh 看apache我发现org.apache.commons.pool非常有用且健壮&#xff0c;但没有充分记录。 因此&#xff0c;我将在这里帮助您解释如何使用Apache KeyedObjectPool 。 什么是KeyedObjectPool &#xff1f; 它是一个映射&#xff0c;其中包含多种类型的实例池。 可以使用任意键访…

问题 1066: 2004年秋浙江省计算机等级考试二级C 编程题(2)

题目描述输入一个正数x和一个正整数n&#xff0c;求下列算式的值。要求定义两个调用函数&#xff1a;fact(n)计算n的阶乘&#xff1b;mypow(x,n)计算x的n次幂&#xff08;即xn&#xff09;&#xff0c;两个函数的返回值类型是double。 x - x2/2! x3/3! ... (-1)n-1xn/n! 输出…

Ubuntu16.04下安装多版本cuda和cudnn

Ubuntu16.04下安装多版本cuda和cudnn 原文 https://blog.csdn.net/tunhuzhuang1836/article/details/79545625 前言因为之前针对Pytorch&#xff0c;caffe&#xff0c;torch等&#xff0c;装了cuda8.0和对应cudnn5.1&#xff0c;但是最近在装MxNet的时候&#xff0c;发现官网上…

什么是javax.ws.rs.core.context? [ 第1部分 ]

如何使用Context批注 JAX-RS API提供了一种非常方便的机制&#xff0c;可以将各种有用的资源&#xff08;例如HTTP标头&#xff09;注入到端点中。 Context注释是一个通用注释&#xff0c;它注入以下对象的实例&#xff1a; HttpHeaders- > HTTP标头参数和值 UriInfo- >…

spring的事件

理论 异步的实现方式可以使用事件&#xff0c;或者异步执行&#xff1b; spring中自带了事件的支持&#xff0c;核心是ApplicationEventPublisher; 事件包括三个要点&#xff1a; 事件的定义&#xff1b;事件监听的定义&#xff1b;发布事件&#xff1b;实战 代码路径&#xff…