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

java 垃圾回收手动回收

并行清理

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

如果您还没有读过我的第一篇有关垃圾收集的博客文章,因为这没有概述。

伊甸园和幸存者空间

在平行的扫气收集器中,使用称为半球GC的方法收集伊甸园和幸存者空间。 对象最初是在Eden中分配的,一旦Eden接近满1 ,就会触发gc的Eden空间。 这样可以识别活动物体并将其复制到活动的“幸存者空间” 2中 。 然后,它将整个Eden空间视为一个空闲的,连续的内存块,可以再次分配到该内存块中。

在这种情况下,分配过程就像切碎切达干酪一样结束。 每个块都被连续切片,然后旁边的切片将被“吞噬”。 这样做的好处是分配仅需要添加指针。

切达干酪一块,准备分配。

切达干酪一块,准备分配。

为了识别活动物体,进行了物体图的搜索。 搜索从一组“根”对象开始,这些“根”对象是可以保证存在的对象,例如,每个线程都是一个根对象。 然后,搜索将找到由根集指向的对象,并向外扩展直到找到所有活动对象。 这是一个非常好的绘画作品,由迈克尔·特里亚纳 ( Michael Triana)提供

堆根

在并行清除的上下文中,并行表示收集是由同时运行的多个线程完成的。 这不应与增量GC混淆,增量式GC的收集器与程序同时运行或交错运行。 通过更好地使用现代多核CPU,并行收集可提高整体GC吞吐量。 通过为每个线程提供一组要标记的根以及对象表的一部分来实现并行性。

有两个幸存者空间,但在任何时间点只有一个处于活动状态。 它们的收集方式与伊甸园相同。 这个想法是,当对象从伊甸园提升时,它们会被复制到活动幸存者空间中。 然后,当需要疏散空间时,会将它们复制到非活动的幸存者空间。 一旦活动幸存者空间被完全撤离,则非活动空间变为活动状态,而活动空间变为非活动状态。 这是通过将指针翻转到幸存者空间的开头来实现的,这意味着可以释放幸存者空间中的所有死对象,而只需分配给单个指针即可。

年轻一代的设计和时间权衡

由于这仅涉及复制活动对象并且指针更改,因此收集伊甸园和幸存者空间所花费的时间与活动对象的数量成比例。 这是非常重要的,因为由于世代的假设,我们知道大多数对象都死于年轻,因此释放与它们相关联的内存没有GC成本。

幸存空间的设计受到这样一种想法的启发:年轻时收集对象比收集长期使用的空间要便宜。 继续以半球方式收集对象以进行几次GC运行,这有助于整体吞吐量。

最后,伊甸园被组织成一个连续的空间,这使得对象分配便宜。 AC程序可能会重新使用“ malloc”命令来分配内存块,这涉及遍历内存中的可用空间列表,以尝试找到足够大的对象。 当您使用竞技场分配器并连续分配时,您需要做的就是检查是否有足够的可用空间,然后将指针增加该对象的大小。

平行标记和扫掠

在一定数量的收藏中幸存下来的物品进入了租用空间。 他们生存所需的次数称为“任职期限”。 使用称为标记和清除的算法,保有权集合的工作方式与Eden有所不同。 每个对象都有一个与之关联的标记位。 标记最初全部设置为false,并且在图形搜索过程中到达对象时将其设置为true。

标识活动对象的图形搜索类似于为年轻一代描述的搜索。 区别在于,它不是复制活动对象,而是对其进行标记。 之后,它可以遍历对象表并释放所有不存在的对象。 该过程由多个线程并行完成,每个线程都搜索堆的一个区域。

不幸的是,删除不活动对象的过程使使用期限的空间看起来像瑞士奶酪。 您会在对象所在的位置获得一些已使用的内存,以及对象之前所在的位置之间的差距。 这种碎片对应用程序性能没有帮助,因为它使分配大于Kong大小的对象成为不可能。

Mark and Sweep之后的奶酪。

Mark and Sweep之后的奶酪。

为了减少Swiss Cheese的问题,并行标记/扫描将堆压缩下来,以尝试在占位空间的开始处连续分配活动对象。 删除后,它搜索租用空间的区域,以识别占用率低和占用率高的区域。 来自占用率较低区域的活动对象向下移至占用率较高的区域。 这些自然位于上一个压缩阶段的内存较低端。 在此阶段中,对象的移动实际上是由分配给目标区域而不是源区域的线程执行的。

低入住率的奶酪。

低入住率的奶酪。

摘要

  • 并行Scavenge将堆拆分为4个空间:伊甸园,两个幸存者空间和终身使用权。
  • 并行Scavenge使用并行的复制收集器到收集器Eden和Survivor Spaces。
  • 租用空间使用了不同的算法。 这会标记所有活动对象,删除不活动的对象,然后压缩空间/
  • 并行Scavenge具有良好的吞吐量,但是在运行时会暂停整个程序。

在第三部分中,我将介绍CMS或Concurrent-Mark-Sweep收集器的工作方式。 希望对乳制品过敏的人更容易阅读这篇文章。

  1. 从技术上讲,每个堆空间都有一个“占用阈值”,它定义了在发生收集之前允许空间达到多大的程度。
  2. 该复制算法基于Cheney算法 。
参考: Insightful Logic博客上来自我们JCG合作伙伴 Richard Warburton的Java垃圾收集(2) 。

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

java 垃圾回收手动回收

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

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

相关文章

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…

java hash=0报空指针_怎么报空指针异常错误?

源自:2-2 开发第一个自定义标签怎么报空指针异常错误?java.lang.NullPointerExceptionat org.apache.tomcat.util.descriptor.tld.TldResourcePath.hashCode(TldResourcePath.java:164)at java.util.HashMap.hash(HashMap.java:338)at java.util.HashMap…

php 跳回上一页_php – Laravel 5 – 登录后重定向回到上一页

我有一个页面上有一些内容和评论部分.注释只能由已登录的用户保留,因此我已将登录表单添加到页面以供用户登录(仅在他们尚未登录时显示).我遇到的问题是,当用户登录时,他们会被重定向回主页,而不是他们之前所在的页面.我还没有从开箱即用的设置中更改登录方法.任何人都可以建议…

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

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

php mailer altbody,PHPMailer发送邮件中文乱码的解决办法

前面我们介绍了PHPMailer的使用方法和实例代码,有些朋友在使用的时候发现,发送中文邮件的时候,标题和内容中文都是乱码,这该如何解决呢?让我们先看一下之前给出的实例代码mail.php文件:require class.phpma…

使用Apache Isis快速进行SEMAT应用程序开发

TL; DR这篇文章谈论我使用Apache Isis创建并部署到此处的OpenShift Online的SEMAT宠物项目: http: //semat.ofbizian.com Apache Isis 作为主要在后端系统上工作的Java开发人员,我讨厌创建用户界面和处理Java脚本。 幸运的是,有J…