java 垃圾回收手动回收_Java垃圾回收(3)

java 垃圾回收手动回收

接下来是我的前两篇垃圾收集博客文章:

  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中,来自类文件的String常量也分配给常规堆,而不是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

java 垃圾回收手动回收

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

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

相关文章

java测试netty_《Netty官方文档》基准测试

原文链接 译者:lijunshuNetty有一个模块叫’netty-microbench’,我们可以用他来执行一系列的微型基准测试。Netty-microbench是基于OpenJDK JMH构件的(HotSpot的推荐基准测试方案)。当你开始netty基准测试时,你不需要额外的依赖。运行基准测…

Java命令行界面(第30部分):观察

这个有关Java命令行参数解析的系列文章由四个月来发表的29篇文章组成,涵盖了28个不同的开放源代码库,可用于解析Java命令行参数。 这篇文章收集了可以从本系列的前29篇文章中得出的一些观点,并提供了一些一般性的考虑,以便在选择2…

java导出excel 科学计数法_基于Java将Excel科学计数法解析成数字

需要注意的是一般的科学表达式是1.8E12 1.8E-12而在Excel中的科学表达式是1.8E12 1.8E-12我写的科学计数法的正则表达式是(-?\d\.?\d*)[Ee]{1}[\-]?[0-9]*导入EXCEL数据时将科学计数法解析成数字,Java代码:import java.text.DecimalFormat;import jav…

java描边_shape描边设置是否显示四周描边

android:width"1pt"/>android:topRightRadius"30pt"android:bottomRightRadius"30pt" />效果图如下:这里设置了左边描边不显示设置虚线:android:shape"line">android:dashGap"3pt"android:d…

java 垃圾回收手动回收_Java垃圾回收(2)

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

java正则表达式性能_译:Java 中的正则表达式性能概述

译者:Darren Luo1. 概述在本快速教程中,我们将展示模式匹配引擎是如何工作的。我们还将介绍在 Java 中优化正则表达式的不同方式。有关正则表达式的的使用介绍,请参阅此文。2. 模式匹配引擎java.util.regex 包使用了一种叫做 Nondeterministi…

带注释的控制器– Spring Web / Webflux和测试

Spring Webflux和Spring Web是两个完全不同的Web堆栈。 但是, Spring Webflux继续支持基于注释的编程模型 使用这两个堆栈定义的端点可能看起来相似,但是测试该端点的方式却大不相同,并且编写此端点的用户必须知道哪个堆栈处于活动状态并相应…

jquery解析java对象数组_Javascript / jQuery初学者:将对象推送到数组

Well you are changing the reference of same object通过示例了解它是如何工作的let a {};let b a;a.name xyz;a.name abc;console.log(a.name)console.log(b.name)所以在上面的示例中我们有两个变量a和b . a是一个对象 .每当我们更新名称时,最后一个值将被新的…

java查看jvm对象个数_jmap-查看 jvm 内存对象信息

jmap 概述命令jmap是一个多功能的命令。它可以生成 java 程序的 dump 文件,也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列。参数option:选项参数。pid:需要打印配置信息的进程ID。executable:产…

OpenHub框架进行的异步通信

在本系列的前一部分中,我们介绍了OpenHub框架 。 这部分显示了框架最强大的功能之一- 异步消息传递模型 。 当源系统无法等待目标系统的响应时,将使用系统之间的异步通信。 有以下几个原因: 源系统必须尽可能地响应 ,并且不受外…

Java实现C语言select函数_一道面试题目,分别用sql 和java,c++, c语言实现,

引用来自“雨翔河”的评论获取国家假日办的的信息,然后根据假日办提供的信息来搞定。日期的话,哈哈,找个提供日期查询的接口,借用一下来查日期,也搞定了。总之哪里有的抄就抄哪里的。再来一个笨蛋的意见,把…

java注解的反射_Java注解与反射

概要本文主要是总结Java注解与反射的相关知识,加深自己对Java类动态语言的理解,同时为日后学习Spring打下基础。注解:什么是注解Annotation的作用不是程序本身,但是可以对程序作出解释。可以被其他程序(比如:编译器等)…

工厂设计模式和策略设计模式_设计模式:策略

工厂设计模式和策略设计模式这次我想谈谈策略设计模式 。 通过这种方式,我开始撰写有关行为设计模式的文章。 这种模式表示对象之间的某些交互模式,以使代码更灵活且组织得更好。此方法的最本质点是对象之间的松散耦合。 当您的应用程序中有多个实现目的…

java 8 排序反转_Java 8 排序小结

1、概述首先,让我们先定义一个简单的实体类:Datapublic class Human {private String name;private int age;public Human() {super();}public Human(final String name, final int age) {super();this.name name;this.age age;}}2、不使用Lambda表达式…

如何将不带web.xml的Spring应用程序部署到Tomcat

介绍 由于Servlet 3规范不再需要web.xml来配置Web应用程序,因此已通过使用注释代替。 在本文中,我们将研究如何在不使用web.xml情况下将简单的基于Spring的应用程序部署到Tomcat 8.5。*。 创建一个空的应用程序 使用以下命令使用maven webapp原型创建一…

java创建单线程计时器_我们如何在Java中实现计时器线程?

该定时器类计划任务一次或多次给定的时间运行。它也可以作为后台程序线程在后台运行。要将Timer与守护程序线程相关联,有一个带有布尔值的构造函数。计时器以固定的延迟和固定的速率安排任务。在固定的延迟中,如果系统GC延迟了任何执行,则其他…

Python和Java结合的项目实战_[项目实战] Python高级教程项目实战篇 Python和Java结合的项目实战 视频教程 [...

资源介绍课程简介:xa0xa0Python高级教程项目实战篇 Python和Java结合的项目实战 视频教程 教学视频----------------------课程目录Python项目实战篇[初级项目:图片社交电商导购漂流瓶]项目实现功能: 用户注册,登录,登出图片的多种…

java04376_Java - jdbc mybatis

jdbc首先配置maven包org.springframework.bootspring-boot-starter-jdbcorg.mybatis.spring.bootmybatis-spring-boot-starter2.1.0注意pom.xml中配置结点src/main/java**/*.xmlfalsesrc/main/resourcesstatic/*.*templates/*.***/*.xml**/*.yml**/*.propertiesfalse针对不同的…

设计模式 建造者模式_设计模式:建造者

设计模式 建造者模式有时需要在应用程序中创建一个复杂的对象。 一种解决方案是Factory模式,另一种是Builder设计模式。 在某些情况下,您甚至可以结合使用这两种模式。 但是在本文中,我想研究一下Builder设计模式 。 我需要说的第一件事是创造…

在MongoDB和Spring Batch中将XML转换为JSON和原始使用

总览 为什么将XML转换为JSON以在MongoDB中原始使用? 由于MongoDB使用JSON文档存储记录,就像表和行将记录存储在关系数据库中一样,我们自然需要将XML转换为JSON。 某些应用程序可能需要存储原始(未修改的)JSON&#xf…