建一个网站花多少钱,河南项目备案信息网,网站建设选天祥,网站建设优化开发公司哪家好这是有关垃圾收集#xff08;GC#xff09;的系列文章中的第一篇。 我希望能够涵盖整个系列过程中的理论知识以及热点虚拟机中的所有主要收集器。 这篇文章仅说明什么是垃圾回收#xff0c;以及不同回收器共有的元素。 我为什么要在乎#xff1f; 您的Java虚拟机可以为您管… 这是有关垃圾收集GC的系列文章中的第一篇。 我希望能够涵盖整个系列过程中的理论知识以及热点虚拟机中的所有主要收集器。 这篇文章仅说明什么是垃圾回收以及不同回收器共有的元素。 我为什么要在乎 您的Java虚拟机可以为您管理内存-这非常方便-但默认情况下可能未对它进行优化调整。 通过了解垃圾收集背后的一些理论您可以更轻松地调整收集器。 一个普遍关心的问题是收集器的效率也就是说您的程序花了多少时间执行程序代码而不是收集垃圾。 另一个常见问题是应用程序暂停的时间长。 关于垃圾收集还有很多传闻和民间传说因此更详细地了解算法确实有助于避免陷入常见的陷阱和陷阱。 此外对于任何对如何应用和使用计算机科学原理感兴趣的人JVM内部都是一件很棒的事情。 停止世界是什么意思 您的程序或GC-Speak中的mutator将在运行时分配对象。 在某个时候需要收集堆并且热点中的所有收集器都会暂停您的应用程序。 “世界停止”一词用于表示所有增变器的线程都已暂停。 可以实现不需要暂停的垃圾回收器。 Azul已在其Zing虚拟机中实现了有效的不间断收集器。 我不会介绍它是如何工作的但是如果您想了解更多信息会有一张非常有趣的白皮书 。 年轻/弱世代假说 简而言之 大多数分配的对象都死于年轻 1 。 通过对1980年代一大批程序的内存分配和活动模式进行实证分析证明了这一概念。 研究人员发现不仅大多数物体死于年轻而且一旦它们活到一定年龄它们就会活很长一段时间。 下图取自SUN / Oracle研究以直方图的形式查看了对象的寿命。 堆的组织方式如何 年轻的世代假设催生了世代垃圾收集的思想在世代垃圾收集中堆被分为几个区域每个区域中对象的放置与它们的年龄相对应。 以上这些垃圾收集器 G1除外共有的一个要素是将堆组织到不同空间的方式。 最初分配对象时如果适合将它们存储在Eden空间中。 如果对象在集合中幸存下来那么它将最终到达幸存者空间。 如果它能够存活几次您的使用期限阈值则该对象最终将出现在使用期限的空间中。 收集器收集这些空间的算法的细节各不相同因此我将在以后的博客文章中单独介绍它们。 这种划分是有益的因为它允许您在不同的空间上使用不同的算法。 如果大多数对象都已失效则某些GC算法效率更高如果大多数对象都处于活动状态则某些GC算法效率更高。 由于世代相传的假设通常是到了在伊甸园收集大多数物体的时候幸存者空间已经死了而保有权的大多数物体还是活着的。 还有永久性的-永久的一代。 这是一个特殊的世代其中包含与Java语言本身相关的对象。 例如此处包含有关已加载类的信息。 从历史上看被插入或为常量的字符串也保存在这里。 永久代已被删除转而支持元空间 。 多个收藏家 热点虚拟机实际上具有各种不同的垃圾收集器。 每个都有不同的性能特征集合并且更或更少适合于不同的任务。 我将要研究的关键垃圾收集器是 并行清理 PS最近发布的JVM中的默认收集器。 为了收集而停止运行但是并行收集即使用多个线程。 并发标记扫描 CMS此收集器具有多个阶段其中一些阶段使世界停滞不前但在该阶段的多个阶段也与程序同时运行。 增量并发标记扫描 iCMSCMS的一种变体旨在降低暂停时间。 有时可以做到这一点 垃圾优先 G1一种新型的收集器最近变得更加稳定并且使用量正在缓慢增加。 结论 我已经对垃圾收集提出了一些介绍性的观点在下一篇文章中我将介绍Parallel Scavenge收集器-它是当前的默认收集器。 我还想提供我的雇主链接该雇主拥有我们认为非常有用的GC日志分析器 。 “热点”是在openjdk和官方Oracle JVM之后通用的代码库的名称。 从Java 7开始openjdk是Java SE的参考实现。 从技术上讲我上面描述的是具有经验验证的“弱代假设”。 还有一个很强的变体可以说是堆分配对象的平均生存期等于可访问存储的平均数量 。 实际上这可以通过采取利特尔定律并将Λ设置为1来从数学上证明。 我将在G1特定的博客文章中介绍G1中堆的组织方式。 参考 Insightful Logic博客上来自我们JCG合作伙伴 Richard Warburton的Java垃圾收集1 。 翻译自: https://www.javacodegeeks.com/2013/06/garbage-collection-in-java-1.html