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

java 垃圾回收手动回收

G1:垃圾优先

G1收集器是热点JVM中要实现的最新收集器。 自Java 7 Update 4以来,它一直是受支持的收集器。OracleGC团队也公开表示,他们对低暂停GC的希望是完全实现的G1。 这篇文章来自我之前的垃圾收集博客文章:

  1. GC热点概述 。
  2. 并行垃圾收集器 。
  3. 并发标记扫描 。

问题:大堆意味着长暂停时间

并发标记和扫描(CMS)收集器是当前推荐的低暂停收集器,但是不幸的是,其暂停时间随使用权区域中活动对象的数量而变化。 这意味着尽管使用较小的堆相对容易获得短暂的GC暂停,但是一旦开始使用10或100千兆字节的堆,时间就会开始增加。

CMS也不会“整理”其堆,因此在某个时间点您会遇到并发模式故障(CMF),从而触发完整的gc。 进入完整的gc场景后,您可以预期每千兆字节活动对象大约在1秒钟的时间内出现暂停。 使用CMS,您的100GB堆可能是等待1.5分钟的GC暂停滴答定时炸弹……

复制品_m67_hand_grenade_wip_by_danboldy-d4ewsgk

良好的GC调优可以解决此问题,但有时只会将问题推向前进。 并发模式故障和完整GC不可避免地会在足够长的时间范围内出现,除非您处在一小部分专门避免填充其使用期限的人员中。

G1堆布局

G1收集器试图通过将堆分成不同的区域来将单个集合的暂停时间与堆的整体大小分开。 每个区域的大小都是固定的,介于1MB和32MB之间,JVM的目标是总共创建大约2000个区域。

g1地区

您可能还记得以前的文章,其他收集器将堆分为Eden,Survior Space和Tenured内存池。 G1保留相同类别的池,但不是将它们作为连续的内存块,而是将每个区域在逻辑上分类为这些池之一。

还有另一种类型的区域-巨大的区域。 这些对象用于存储大小比大多数对象大的对象,例如,很长的数组。 任何大于区域大小50%的对象都存储在巨大的区域中。 它们通过获取连续位于内存中的多个正常区域并将它们视为单个逻辑区域来工作。

g1区域类型

记忆集

当然,如果您将不得不扫描整个堆以找出哪些对象被标记为活动对象,那么将堆分成多个区域毫无意义。 实现此目标的第一步是将区域分成称为卡的512字节段。 每张卡在卡标记表中都有一个1字节的条目。

每个区域都有一个关联的记忆集或RSet-这是已写入的卡集。 如果来自存储在卡中的另一个区域的对象指向该区域中的对象,则卡处于记忆集中。

每当增变器写入对象引用时,就会使用写屏障来更新已记住的集。 在内部,将记住的集合分为不同的集合,以便不同的线程可以在没有争用的情况下运行,但是从概念上讲,所有集合都是同一集合的一部分。

并发标记

为了识别哪些堆对象是活动的,G1执行活动对象的大部分并发标记。

  • 标记阶段标记阶段的目标是弄清楚堆中哪些对象是活动的。 为了存储哪些对象处于活动状态,G1使用了标记位图-堆中每64位存储一个位。 从所有对象的根部开始跟踪,并在标记位图中使用活动对象标记区域。 这主要是并发的,但是有一个类似于CMS的“ 初始标记暂停” ,其中应用程序被暂停并且跟踪根对象的第一级子级。 完成此操作后,重新启动线程。 G1需要对堆中存在的内容保持最新了解,因为不会在标记阶段的同一暂停中清理堆。
  • 标记阶段标记阶段的目标是使标记阶段中有关活动对象的信息保持最新。 首先要做的是确定何时进行标记。 由一定百分比的堆已满触发。 这是通过从标记阶段和此后的分配数量中获取信息来计算的,并告诉G1其是否超过了所需的百分比。 G1使用上述写屏障来记录对堆的更改,并将其存储在一系列更改缓冲区中 。 更改缓冲区中的对象同时在标记位图中标记。 当达到填充百分比时,将再次暂停更改程序线程并处理更改缓冲区,从而将更改缓冲区中的对象标记为活动状态。
  • 清理阶段此时,G1知道哪些对象处于活动状态。 由于G1专注于可用空间最大的区域,因此其下一步是通过计算活动对象来计算给定区域中的可用空间。 这是从标记位图计算得出的,然后根据最有可能收集哪些区域来对区域进行排序。 要收集的区域存储在所谓的收集集或CSet中

疏散

与半球年轻一代在并行GC和CMS收集器中采用的方法类似,不会收集死物。 取而代之的是,将有生命的物体从某个区域撤离,然后将整个区域视为空闲区域。

G1对于如何回收活动物体很聪明–它不会尝试在给定的周期内回收所有活动物体。 它针对的是可能会回收尽可能多空间的区域,仅将其撤离。 它通过计算活动对象在一个区域内的比例并选择活动对象比例最低的区域来确定其目标区域。

将物体从多个其他区域撤离到自由区域。 这意味着G1在执行GC时会压缩数据。 这由多个线程并行操作。 传统的“平行GC”可以做到这一点,而CMS不这样做。

与CMS和Parallel GC相似,存在权属概念。 也就是说,如果年轻对象在足够的收藏中存活下来,它们就会变“旧”。 此数字称为任职期限。 如果年轻的世代区域幸存下来,并且保留了足够的活物以避免被疏散,那么该区域将得到提升。 首先是幸存者,最后是终身制地区。 它从未被疏散。

疏散失败

不幸的是,G1仍然会遇到类似于并发模式故障的情况,在这种情况下,它会退回到Stop the World Full GC。 这称为疏散失败,在没有空闲区域时发生。 没有自由区域意味着没有地方疏散物体。

从理论上说,与CMS中的并发模式故障相比,G1中发生疏散失败的可能性较小。 这是因为G1会即时压缩其区域,而不仅仅是等待压缩失败。

结论

尽管进行了压缩和在低暂停时做出的努力,但G1并不能保证会取得成功,因此采用它的任何尝试都应伴随有客观且可衡量的性能目标以及GC Log分析。 所需的方法超出了本博客文章的范围,但希望我在以后的文章中介绍它。

从算法上讲,G1会遇到其他Hotspot收集器不会遇到的开销。 值得注意的是,维护记忆集的成本。 并行GC仍然是推荐的吞吐量收集器,并且在许多情况下CMS都比G1更好。

现在说G1是否会比CMS收集器大胜还为时过早,但是在某些情况下,它已经为使用它的开发人员提供了好处。 随着时间的流逝,我们将看到G1的性能限制是否真的是G1的限制,或者开发团队是否只是需要更多的工程工作来解决那里的问题。

感谢John Oliver , Tim Monks和Martijn Verburg审阅了本指南和以前的GC文章的草稿。

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

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

java 垃圾回收手动回收

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

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

相关文章

使用正确的垃圾收集器将Java内存使用量降至最低

大小对于软件至关重要。 很明显,与大型整体方法相比,在微服务体系结构中使用小型组件具有更多优势。 最新的Java版本的Jigsaw可帮助分解旧应用程序或从头开始构建新的云原生应用程序。 这种方法减少了磁盘空间,构建时间和启动时间。 但是&am…

java 鼠标画多个圆形_点击鼠标不同的建(左、中、右)画一个不同颜色的圆

[java]代码库import java.awt.Color;import java.awt.Graphics;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import javax.swing.JFrame;public class T1 extends JFrame{int x;int y;Color c;public T1(){this.setSize(600,400);this.setDefaultCl…

通过粘性仙人掌基元进行延迟加载和缓存

您显然知道什么是延迟加载 ,对吗? 而且您无疑知道缓存 。 据我所知,Java中没有一种优雅的方法来实现它们中的任何一个。 这是我在Cactoos原语的帮助下为自己找到的。 Matteo Garrone的《 Reality(2012)》 假设我们需…

java语言编程基础_java语言编程基础

java语言基本要素高级语言如c、c#、java等都有一些共同性的东西:关键字、标识符、运算符、注释、数据类型、常量和变量、语句、函数、数组。高级语言在这些要素上大同小异。Java关键字:一些有特定含义,有专门用途的字符串(keyword)。Java中关…

junit mockito_JUnit和Mockito合作

junit mockito这次,我想对测试框架Mockito进行概述。 毫无疑问,这是用于测试Java代码的最受欢迎的工具之一。 我已经对Mockito的竞争对手EasyMock进行了概述。 这篇文章将基于有关EasyMock的示例应用程序。 我的意思是代表咖啡机功能的类。 使用Mockito…

debian10树莓派4安装mysql_树莓派4上如何安装 Raspbian Buster

随着 Raspberry Pi 4 主板的问世,了解如何使用Raspbian Buster设置您的操作系统。你的新Pi 4到了邮箱,你已经设置了办公桌,您已准备好安装操作系统。对于初学者来说,Raspbian为Pi制造商提供了出色的桌面体验。最重要的是&#xff…

借助财务客户评估解决方案在云中构建AppDev

现代JBoss BRMS时代最古老的业务逻辑演示是2012年6月发布的“ 客户评估”示例 。 那时,JBoss BRMS包含规则,事件和流程。 该项目提供了一个完整安装和配置的环境,用于展示该项目和所有可用的BPM组件。 它包括一个带有单元测试的JBoss Develo…

jvm 性能_JVM性能魔术

jvm 性能HotSpot是我们众所周知和喜爱的JVM,是Java和Scala汁流淌的大脑。 多年来,许多工程师对其进行了改进和调整,并且每次迭代时,其代码执行的速度和效率都接近于本机编译代码。 JIT(“及时”)编译器是…

Hollowjars,部署扫描程序以及Wildfly群体为何很棒

在上一篇文章中,我描述了如何使用OpenLiberty和maven作为独立服务器或maven构建的一部分来启动服务器,以及如何创建fatjar包。 在这篇文章中,我正在研究如何使用Wildfly群。 我仍在尝试使MicroProfile在Wildfly full上运行,因此&…

Java调用跟踪系统_Tracer:在分布式系统中的调用跟踪和日志相关

Tracer: Distributed system tracingTracer noun, /ˈtɹeɪsɚ/: A round of ammunition that contains a flammable substance that produces a visible trail when fired in the dark.Tracer is a library that manages custom trace identifiers and carries them through …

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

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

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来获得此选项…

OpenHub框架进行的异步通信

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

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

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

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

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

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

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

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

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

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

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

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

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