gc垃圾收集器 与gc算法_GC解释:收集器概述

gc垃圾收集器 与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

gc垃圾收集器 与gc算法

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

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

相关文章

安兔兔跑分可信吗_安兔兔安卓手机跑分性能榜公布:第一名实至名归?

3月5日消息,安兔兔官方放出了2019年2月份国内安卓手机的性能跑分排行榜。从榜单中我们可以看到排名前三的分别是:小米9、联想Z5 Pro GT 855版、红魔Mars电竞手机。不出所料,前三名都是高通平台的旗舰Soc,骁龙855和骁龙845。骁龙85…

c语言sort函数排序二维数组,c++ - 如何使用stl sort函数根据第二列对二维数组进行排序? - 堆栈内存溢出...

stl排序要求迭代器的rvalue作为参数传递。 如果你想使用sort函数,你必须在c 11中编译并使用数组stl来存储数组。 代码如下#include "bits/stdc.h"using namespace std;bool compare( array a, array b){return a[0]}int main(){int i,j;array, 5> ar1…

IntelliJ IDEA for Mac 类和方法注释模板设置

文章目录类注释模板设置使用 File and Code Templates方法 1:直接在编辑区编写模板代码方法 2:使用 parse 指令来引用注释模板使用 Live Templates方法注释模板设置注意事项解决注释模板无法获取参数名和返回值类型的问题类注释模板设置 使用 File and …

java streams_使用JShell的Java 9 Streams API

java streams这篇文章着眼于使用JShell的Java 9 Streams API。 Streams API的更改以Java 8中Streams的成功为基础,并引入了许多实用程序方法– takeWhile,dropWhile和iterate。 这篇文章延续了My Top Java 9功能,并使用Jshell探索了这些方法。…

c语言中dfs用pos做参数,LeetCode算法练习——深度优先搜索 DFS(2)

更多干货就在我的个人博客 BlackBlog.tech 欢迎关注!也可以关注我的csdn博客:黑哥的博客谢谢大家!我们继续LeetCode之旅.做了一段时间的LeetCode,感觉还是不错的。算法很基础,没有特别难的(至少我看在做的)&#xff0c…

机试题型_2020年焊工(技师)新版试题及焊工(技师)试题及答案

题库来源:安全生产模拟考试一点通公众号小程序2020年焊工(技师)新版试题及焊工(技师)试题及答案,包含焊工(技师)新版试题答案和解析及焊工(技师)试题及答案练习。由安全生产模拟考试一点通公众号结合国家焊工(技师)考试最新大纲及焊工(技师)考试真题汇总…

Eclipse 如何修改默认工作空间和切换工作空间(Workspace)

文章目录如何关闭/开启 Eclipse Launcher 弹窗提示通过配置文件设置通过 IDE 的偏好设置如何修改 Eclipse 默认的工作空间和切换工作空间通过配置文件修改通过 Eclipse Launcher 窗口修改通过菜单来切换工作空间如何关闭/开启 Eclipse Launcher 弹窗提示 通过配置文件设置 ec…

hashmap java_Java – HashMap详细说明

hashmap javaHashMap基于哈希算法工作,根据Java文档HashMap具有以下四个构造函数, 建设者 描述 HashMap ​() 构造一个空的 具有默认初始容量(16)和默认加载因子(0.75)的HashMap 。 HashMap ​(int i…

Tomcat 的目录结构

bin:存放的是可执行文件,比如启动和关闭服务器的一些脚本命令 conf:存放的是 Tomcat 服务器的各种全局配置文件,其中包括 server.xml(Tomcat的主要配置文件)、tomcat-users.xml 和 web.xml 等配置文件 li…

广州电子厂房净化工程_简述设计电子车间净化工程的注意要点

在电子车间净化工程的设计、安装、选择净化设备与彩钢夹芯板的时候有哪些需要注意的要点呢?这些看起来不太重要的细节,却往往大大的影响了电子净化车间的净化效率与洁净度。而且这些注意要点,不仅在电子净化车间中适用,在食品加工厂、制药净…

C语言循环结构素数判断,C语言实验之判断素数(循环结构java)方法讲解

C语言实验之判断素数(循环结构java)方法讲解Problem Description从键盘上输入任意一个正整数&#xff0c;然后判断该数是否为素数。如果是素数则输出"This is a prime."否则输出“This is not a prime.”Input输入任意一个正整数n(1 < n < 1000000)。Output判断…

使用log4j记录日志_使用log4j2免费分配日志记录

使用log4j记录日志介绍 最近&#xff0c;我正在为一个客户端工作&#xff0c;试图为大型精心制作的Java系统消除一些GC暂停。 经过分析后&#xff0c;我意识到大部分垃圾都是通过日志记录产生的&#xff01; 是否有一种简单的方法来删除所有分配&#xff1f; 原来有:) 我应该使…

Java Web工程结构_项目结构

文章目录Eclipse 的 Java Web 工程目录结构IDE 的目录结构截图本地的工作空间&#xff08;Workspace&#xff09;中的目录结构目录说明Eclipse 的 Java 工程目录结构IDE 的目录结构截图本地的工作空间中的工程目录MyEclipse 的 Java Web 工程目录结构IDE 目录结构截图本地的工作…

一天发多少短信会封号_枸杞一天吃多少?吃多了会怎样?黑枸杞红枸杞哪个好?...

●枸杞一天吃多少&#xff1f;其实枸杞作为一种滋补品&#xff0c;不适合过多的使用&#xff0c;因为那样反而会造成反作用和不良影响&#xff0c;健康的成年人每天吃20克左右就合适了&#xff0c;这样对一些疾病的治疗&#xff0c;才可以发挥更好的效果。如果是用枸杞子泡水喝…

c语言线程传int值,如何用C语言实现多线程

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Windows操作系统&#xff0c;C语言实现多线程&#xff1a;#include #include DWORD APIENTRY ThreadOne ( LPVOID threadArg ){printf ( "线程开始啦&#xff0c;参数是&#xff1a;%s\n" , (char *)threadArg );return …

aws集群重启_在AWS中设置Cassandra集群

aws集群重启Apache Cassandra是一个NoSQL数据库&#xff0c;它使用一致的哈希机制可以轻松进行水平扩展。 七年前&#xff0c;我尝试了它&#xff0c;并决定不将其用于我的附带项目&#xff0c;因为它太新了。 现在情况有所不同&#xff0c;Cassandra早已建立起来&#xff0c;背…

IntelliJ IDEA for Mac 如何将普通 Java 项目变为 Web 项目

点击菜单栏 File --> Project Structure 在弹出的窗口中点击选择左侧的 Facets&#xff0c;接着点击右边的 &#xff0c;弹出的菜单中选择 web 在弹出的 『Choose Module』窗口中选择要转为 web 的项目&#xff08;模块&#xff09;&#xff0c;然后点击 OK 选择好模块后…

python flagin flagout_Python 进阶之路 (十) 再立Flag, 社区最全的itertools深度解析(中)...

前情回顾大家好&#xff0c;我又回来了。今天我会继续和大家分享itertools这个神奇的自带库&#xff0c;首先&#xff0c;让我们回顾一下上一期结尾的时候我们讲到的3个方法&#xff1a;combinations()combinations_with_replacement()permutations()让我们对这3个在排列组合中…

android 蓝牙耳机 sco,java – Android:通过Sco蓝牙耳机播放声音

在过去的几天里,我一直试图从我的Android手机上播放我的sco蓝牙耳机上的任何声音.我这个项目的最终目标是最终制作一个车库门开启器,但首先我需要能够通过耳机播放声音.这是我正在使用的当前代码的基础&#xff1a;ManifestCodeaudioManager (AudioManager) getSystemService(…

neo4j 连接超时_Neo4j:遍历查询超时

neo4j 连接超时在过去的几周中&#xff0c;我一直在花一些业余时间来创建一个应用程序&#xff0c;该应用程序从Open Roads数据生成运行路线-当然&#xff0c;已转换并导入了Neo4j&#xff01; 我创建了一个用户定义的过程&#xff0c;该过程结合了几个最短路径查询&#xff0…