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之后的奶酪。

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

低入住率的奶酪。

摘要

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

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

  1. 从技术上讲,每个堆空间都有一个“占用阈值”,它定义了在发生收集之前允许空间达到多大的程度。
  2. 该复制算法基于Cheney算法 。

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

java 垃圾回收手动回收

java 垃圾回收手动回收_Java垃圾回收(2)相关推荐

  1. java垃圾回收根对象_Java垃圾回收怎么理解?

    展开全部 Java的堆是一个运行时数据区,类的实例(对象)从中62616964757a686964616fe58685e5aeb931333339653664分配空间.Java虚拟机(JVM)的堆中储 ...

  2. java垃圾回收 分代_Java 垃圾回收机制 (分代垃圾回收ZGC)

    什么是自动 自动垃圾回收是一种在堆内存中找出哪些对象在被使用,还有哪些对象没被使用,并且将后者删掉的机制.所谓使用中的对象(已引用对象),指的是程序中有指针指向的对象:而未使用中的对象(未引用对象), ...

  3. java gc回收机制种类_Java垃圾回收机制

    对象被判定为垃圾的算法 引用计数算法 和 可达性分析算法 引用计数算法 判断对象的引用数量通过判断对象的引用数量来决定对象是否可以被回收 每个对象实例都有一个引用计数器,被引用+1,完成引用-1 任何 ...

  4. java 垃圾回收手动回收_Java垃圾回收(4)

    java 垃圾回收手动回收 G1:垃圾优先 G1收集器是热点JVM中要实现的最新收集器. 自Java 7 Update 4以来,它一直是受支持的收集器.OracleGC团队也公开表示,他们对低暂停GC ...

  5. java 强制垃圾回收_Java垃圾回收机制

    Java垃圾回收机制 垃圾回收机制用到finalize.当程序创建对象.数组等引用类型实体时,系统都会在堆内存中为之分配一块内存区,对象就保存在这块内存中,当这块内存不再被任何引用变量引用时,这块内存 ...

  6. java gc会回收类么_Java GC 垃圾回收机制

    一.Java GC是什么? Java垃圾回收是对JVM(Java Virtual Machine)中的内存进行标记,并确定哪些内存需要回收,根据一定的回收策略,自动的回收内存,永不停息(Nerver ...

  7. 物品回收平台java代码_java垃圾回收

    jvm何时回收一个java对象所占的内存? 当java对象失去引用时,JVM垃圾回收机制会清除他们,回收所占内存空间. java有没有内存泄漏? 无用的内存没有被回收就是内存泄漏. C++内存泄漏:内 ...

  8. java与c内存管理_Java基础--Java内存管理与垃圾回收

    Java自动内存管理 在讲解内存管理之前,首先需要了解对象和对象引用的区别 对象是类的一个实例,以人这个类为例,Person是我们定义的一个类 public class Person{} public ...

  9. java垃圾回收菜鸟_java垃圾回收机制

    1:对象可能不被垃圾回收 2:垃圾回收并不等于"析构" 3:垃圾回收只与内存有关,为了回收程序不再使用的内存 java虚拟机采用了"自适应"的垃圾回收机制,即& ...

最新文章

  1. Javascript类型转换的规则
  2. 产品助理要练哪些姿势,才能看上去舞步优雅?
  3. springboot aop使用_Spring Boot 的自动配置,是如何实现的?
  4. Dynamic Graph CNN for Learning on Point Clouds(DGCNN)论文阅读笔记——核心思想:EdgeConv细析
  5. php黑名单绕过,利用最新Apache解析漏洞(CVE-2017-15715)绕过上传黑名单
  6. 还找不到想要的文章吗?微信公众号搜索方法大全
  7. Python数学建模 缺失值与异常值处理
  8. 2022天府杯国际赛数学建模题目和思路
  9. cadence SPB17.4 - orcad - 层次原理图
  10. TIBCO.Rendezvous简单的发消息的过程
  11. Kotlin back field
  12. 无线网络部署与规划要点及案例分享
  13. termux关于python3.10中下载numpy,pandas,matplotlib,以及jupyter|ahonsmile
  14. U盘、移动硬盘;固态硬盘、机械硬盘
  15. LoRa节点如何以ABP方式入网TTN服务器?
  16. 用HTML制作一首诗
  17. ArcEngine创建平头缓冲区的方法
  18. 强烈推荐 10 本我私藏的数据库书单,附读书方法,java程序设计项目化教程
  19. 这些Linux技能你会了,面试官:哎呦小伙子不错哦!
  20. 关于真机调试DDMS中的data文件夹打不开的解决方法

热门文章

  1. 6、oracle数据库下查询操作
  2. Java Jenkins Api
  3. SpringCloud Gateway配置自定义路由404坑
  4. Java压缩技术(三) ZIP解压缩——Java原生实现
  5. HtmlParser提取网页中的纯文本信息
  6. Spring Enable*高级应用及原理
  7. 3班的第二次模拟面试
  8. ssm使用全注解实现增删改查案例——Dept
  9. javaWeb服务详解(含源代码,测试通过,注释) ——Emp的Dao层
  10. hibernate在分层架构中修改数据(update)时遇到的问题!!