Java垃圾回收(3)

这是我之前的两个垃圾收集博客文章中的内容:

  1. 热点GC概述 。
  2. 并行垃圾收集器 。

并发标记扫描

Hotspot中的并行垃圾收集器旨在最大程度地减少应用程序进行垃圾收集所花费的时间,这称为吞吐量 。 对于所有应用程序来说,这并不是一个适当的权衡取舍–有些应用程序还要求个别的暂停时间要短一些,这被称为延迟要求。

并行标记扫描 (CMS)收集器被设计为比并行收集器低的延迟收集器。 该设计的关键部分是尝试在应用程序运行的同时进行部分垃圾回收。 这意味着当收集器需要暂停应用程序的执行时,它不需要暂停那么长时间。

在这一点上,您可能会想: “并行和并发意味着不是很相似吗?” 在GC的上下文中, 并行意味着“使用多个线程同时执行G​​C”,而并行意味着“ GC与应用程序在其收集的同时运行”。

年轻的世代收藏

CMS中的年轻发电器收集器称为ParNew ,它实际上使用了与我之前介绍的并行收集器中的Parallel Scavenge收集器相同的基本算法。

尽管在热点代码库方面,这与Parallel Scavenge还是一个不同的收集器,因为它需要与其他CMS交织其执行,并且还为Parallel Scavenge实现了一个不同的内部API。 Parallel Scavenge会假设与哪个永久性收集器一起使用-特别是ParOld和SerialOld。 赤裸裸地记住,这也意味着年轻的一代收藏家正在制止这个世界。

终身收藏

与ParOld收集器一样,CMS终身收集器使用标记和清除算法,其中标记活动对象,然后删除无效对象。 当涉及到内存管理时,删除确实是一个奇怪的名词。 收集器实际上不是在消隐内存的意义上删除对象,它只是将与该对象关联的内存返回到内存系统可以从中分配的空间–空闲列表。 尽管它被称为并发标记和清除收集器,但并非所有阶段都与应用程序的执行同时运行,其中两个阶段停止运行,四个阶段同时运行。

GC是如何触发的?

在ParOld中,当永久性堆中的空间不足时,将触发垃圾回收。 这种方法行之有效,因为ParOld只是暂停了应用程序的收集。 为了使应用程序在保管期收集期间继续运行,CMS收集器需要在保管期剩下足够的工作空间时开始收集。

因此,CMS将根据使用期限的长短来启动–想法是,剩余的可用空间是运行GC的机会之窗。 这称为启动占用率 ,用堆的满来描述,因此0.7的百分比为您提供了30%的堆窗口,以便在堆用完之前运行CMS GC。

相数

触发GC后,CMS算法将包含一系列按顺序运行的阶段。

  1. 初始标记 –暂停所有应用程序线程,并将可从根对象直接访问的所有对象标记为活动。 这个阶段使世界停滞不前
  2. 并发标记 –重新启动应用程序线程。 通过遵循在初始标记中标记的对象的引用,所有可移动对象都被可传递地标记为可到达。
  3. 并发预清理 –此阶段查看在并发标记期间已更新或升级的对象或在并发标记期间已分配的新对象。 它更新标记位以指示这些对象是活动的还是死亡的。 此阶段可以重复运行,直到在Eden中有指定的占用率为止。
  4. 备注由于某些对象可能已在预清理阶段中进行了更新,因此仍然有必要停止世界以便处理残留的对象。 此阶段从根开始进行回溯。 它还处理参考对象,例如软参考和弱参考。 这个阶段使世界停滞不前
  5. 并发扫描 –通过普通对象指针(OOP)表进行查找,该引用了堆中的所有对象,并找到了无效的对象。 然后,它将分配给这些对象的内存重新添加到其空闲列表中。 这是可以从中分配对象的空间的列表。
  6. 并发重置 –重置所有内部数据结构,以便将来能够再次运行CMS。

从理论上讲,在预清理阶段标记的对象将在下一个阶段-注释-进行查看,但是注释阶段是使世界停滞不前,因此存在预清理阶段,通过同时执行部分注释工作来尝试减少注释暂停。 CMS最初添加到HotSpot时,此阶段根本不存在。 它是在Java 1.5中添加的,目的是解决年轻一代的垃圾回收导致暂停并在其后立即加上备注的情况。 这句话还会引起停顿,这会造成更痛苦的停顿。 这就是为什么评论由伊甸园的占用阈值触发的原因-目标是在年轻的发电机停顿之间安排评论阶段的中间时间。

备注阶段也处于暂停状态,而预清洁没有暂停,这意味着进行预清洁会减少在GC中暂停所花费的时间。

并发模式故障

有时CMS无法满足应用程序的需求,因此需要运行世界各地的Full GC。 这称为并发模式故障,通常会导致长时间的暂停。 当保有期中没有足够的空间来提升对象时,就会发生并发模式失败。 造成这种情况的原因有两个:

  • 提升的对象太大而无法放入内存中的任何连续空间。
  • 保有权使用的空间不足以说明要升级的活动对象的比率。

之所以会发生这种情况,是因为在给定对象提升速率的情况下,并发集合无法足够快地释放空间,或者由于CMS收集器的继续使用导致了碎片化的堆,并且没有足够大的单个空间来将对象提升为对象。 为了正确“整理”使用年限的堆空间,需要完整的GC。

彼尔姆根

CMS默认情况下不收集permgen空间,并且需要启用?XX:+CMSClassUnloadingEnabled标志才能这样做。 如果在使用CMS时,如果未打开此标志就用完了permgen空间,它将触发Full GC。 而且,permgen空间可以通过类加载器之类的东西将引用保存到普通堆中,这意味着在收集Permgen之前,您可能会泄漏常规堆中的内存。 在Java 7中,来自类文件的字符串常量也分配在常规堆中,而不是分配在permgen上,这减少了permgen的消耗,但同时也增加了来自permgen进入常规堆的对象引用集。

浮动垃圾

在CMS收集结束时,可能会删除某些对象(称为浮动垃圾)。 从初始标记开始取消引用对象时,就会发生这种情况。 并发的预清理和备注阶段可通过查看已创建,变异或升级的对象来确保对所有活动对象进行标记。 如果某个对象在初始标记和标记阶段之间已被取消引用,则它将需要整个对象图的完整回溯才能找到所有死对象。 这显然是非常昂贵的,并且备注阶段必须暂停,因为它是暂停阶段。

对于CMS用户而言,这不一定是一个问题,因为下一次运行CMS收集器将清除此垃圾。

摘要

并发标记和扫描通过在应用程序运行的同时执行某些GC工作,减少了在并行收集器中观察到的暂停时间。 它不能完全消除暂停,因为其算法的一部分需要暂停应用程序才能执行。

我花了比我原本希望写这篇博客文章更长的时间-但是,如果您想知道我的下一篇文章何时发布,只需在此博客的右上角输入您的电子邮件即可通过电子邮件订阅。

参考: Insightful Logic博客中来自JCG合作伙伴 Richard Warburton的Java垃圾收集(3) 。

翻译自: https://www.javacodegeeks.com/2013/06/garbage-collection-in-java-3.html

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

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

相关文章

display转块状化

display:block block元素会独占一行,多个block元素会各自新起一行。默认情况下,block元素宽度自动填满其父元素宽度。 block元素可以设置width,height属性。块级元素即使设置了宽度,仍然是独占一行。 block元素可以设置margin和padding属性。 display:in…

php论坛思路,PHP论坛实现积分系统的思路代码详解

PHP论坛实现积分系统的思路代码详解,积分,头像,等级,用户,字段PHP论坛实现积分系统的思路代码详解易采站长站,站长之家为您整理了PHP论坛实现积分系统的思路代码详解的相关内容。首先在用户表定义一个积分字段;然后创建一个等级表,主要字段有…

Spring MVC:会话高级

不久前,我写了一篇关于Spring MVC应用程序中HTTP会话的文章。 那是简单的文章,着重于用法的实际方面。 在文章的最后,我保证会写一些更高级的主题,专门针对Spring MVC应用程序中的会话。 因此,我将发布这些东西。 在开…

Linux LVM管理

LVM(Logical Volume Manager)逻辑卷管理是在Linux2.4内核以上实现的磁盘管理技术。它是Linux环境下对磁盘分区进行管理的一种机制。 本文内容: 创建和管理LVM扩容LVM分区一、创建和管理LVM 要创建一个LVM系统,一般需要经过以下步骤: 1、 创建…

USB OTG插入检测识别

一 USB引脚一般四根线,定义如下: 为支持OTG功能,mini/micro usb接口扩展了一个ID引脚(第4脚) A设备端ID脚接地,则初始状态为Host,例如PC和支持OTG设备做主设备时 B设备端ID脚悬空,默…

CSS3与页面布局学习笔记(三)——BFC、定位、浮动、7种垂直居中方法

一、BFC与IFC 1.1、BFC与IFC概要 BFC(Block Formatting Context)即“块级格式化上下文”, IFC(Inline Formatting Context)即行内格式化上下文。常规流(也称标准流、普通流)是一个文档在被显示…

matlab空间截面回归,截面空间回归模型操作应用手册

原标题:截面空间回归模型操作应用手册SAR模型数据集包含对地理区域或其他单元的观测;所以需要的是有一些距离的度量标准来区分哪些单位彼此之间比较近。spregress命令对横断面数据进行建模。它要求每一个观察都代表一个独特的空间单元。对于每个单元(即面板数据)有多…

Java垃圾回收(2)

并行清理 今天,我们介绍了并行GC的工作原理。 具体来说,这是在Eden上运行Parallel Scavenge收集器,在Tenured一代中运行Parallel Mark and Sweep收集器的组合。 您可以通过传递-XX: UseParallelOldGC来获得此选项,尽管…

Navicat Premium创建MySQL存储过程

1、使用Navicat Premium打开创建函数向导,操作:连接名——数据库——函数——新建函数 2、选择过程——输入存储过程参数——完成(这一步可以不填写参数,编写存储过程代码的时候设置参数) 3、按照要求完成存储过程代码…

CSS3与页面布局学习笔记(二)——盒子模型(Box Model)、边距折叠、内联与块标签、CSSReset

一、盒子模型(Box Model) 盒子模型也有人称为框模型,HTML中的多数元素都会在浏览器中生成一个矩形的区域,每个区域包含四个组成部分,从外向内依次是:外边距(Margin)、边框&#xff…

mysql中将某个字段做计算,mysql创建计算字段使用子查询教程

作为计算字段使用子查询使用子查询的另一方法是创建计算字段。假如需要显示 customers表中每个客户的订单总数。订单与相应的客户ID存储在 orders 表中。为了执行这个操作,遵循下面的步骤。(1) 从 customers 表中检索客户列表。(2) 对于检索出的每个客户&#xff0c…

像Java这样的C ++具有低延迟

总览 以前,我写过一篇有关Java之类的C的文章。 这是我以前遇到的术语。 但是,经过思考,我认为像Java这样的C 是一个更好的术语,因为您仍在使用OOP做法(不是C风格的),但是您需要自己进行更多的工…

项目一总结

1、编程逻辑不明确的问题 在项目开始阶段,项目分工应根据项目模块进行详细分工,公用部分应尽量节省时间 2、对于文件命名规则的定义,现在项目名字命名很乱,在项目整合时会出很多问题 3、文件目录不清晰,条理性差 4、代…

Android GreenDao使用教程

一、Greendao简介 Greendao是一款用于数据库创建与管理的框架,由于原生SQLite语言比较复杂繁琐,使得不少程序员不得不去学习SQLite原生语言,但是学习成本高,效率低下,所以不少公司致力于开发一款简单的数据库管理框架&…

matlab如何将相近的数据,matlab新手,求帮助!主要是如何将数据和公式导入

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼这是别人给我的程序,我想问一下怎么把我的两个excel数据导入,以及公式怎么写?clc;clear all;close all;datadlmread(all_data_in_situ_lxz.txt);data(6,:)[];data(12,:)[];data(13,:)[];data(13,…

Java垃圾回收(1)

这是有关垃圾收集(GC)的系列文章中的第一篇。 我希望能够涵盖整个系列过程中的理论知识以及热点虚拟机中的所有主要收集器。 这篇文章仅说明什么是垃圾回收,以及不同回收器共有的元素。 我为什么要在乎? 您的Java虚拟机可以为您管…

如果

(最近遇到了一些困难,这篇翻译自己一直就很喜欢,贴上来鼓励自己。) 如果 吉卜林【英】芮成钢【译】 如果,身边的人都失去理智,并将其归咎于你, 而你却能保持清醒; 如果,所…

深入c#的string类

一.字符串常用方法 1.IndexOf("") 如果找到字符串出现的位置则为索引位置,否则返回-1,索引从0开始 2.string Substring( int startIndex , int length ); 从开始位置startIndex,截取到结束位置(截取长度length&#xff…

go语言服务器连接mysql,服务器mysql怎么配置才能远程连接

如何设置MYSQL服务器允许远程连接?如果你使用的与数据库不在同一台服务器上电脑,那么MySQL 服务器就需要允许远程链接,网站才能正常运行。那么如何设置MYSQL服务器允许远程连接呢?我想这是很多人都想提出的疑问,下面是…

h1、h2、h3标签及strong标签对页面seo的影响

今天和大家来聊下h1,h2,h3,strong几个标签&#xff0c;在网页中的使用对页面seo的影响&#xff0c;也阐述了个人的一些想法。 首先简要讲下H标签及strong标签的含义&#xff1a;<h1>、<h2>、<h3>、<h4>、<h5>、<h6>,作为标题使用&#x…