爪哇中的垃圾回收

在这篇文章中,我们将在 爪哇.

我将尝试借助图表和示例而不是理论来进行解释。

JVM内存分为三个部分

  • 年轻一代
  • 老一辈
  • 元空间(彼尔姆一代)

年轻一代

顾名思义,年轻一代是新创造的地区 对象 are allocated.

  • 当年轻一代填满时,将导致较小的垃圾收集,也称为次要GC。
  • 当发生较小的Gcs时,死物将从年轻一代中移除。
  • 如果您在年轻一代中有很多死物,那么Minor GC的性能会更快。
  • 所有次要GC都是“stop the world”事件,因此当发生次要GC时,应用程序线程也将停止。

让 ’可以进一步了解如何在Young generation中分配对象。

年轻一代分为三个部分。

  • 伊甸园空间
  • 幸存空间S0
  • 幸存者空间S1

这是年轻一代和老一代的例证。

年轻老一代

    • 所有新创建的对象都分配在eden空间中。
    • 当伊甸园空间完全充满物体时,将发生次要GC。所有未失效或未引用的对象将移动到幸存者空间之一。就我们而言’s说所有对象都移到了S0。


S0分配的对象

    • 当再次填充Eden空间时,Eden空间和幸存者空间S0中的所有活动对象都将移动到Survivor空间S1。

S0T0S1AlloactedObjects
S1AllocatedObjects

  • 一旦对象在次要GC的多个周期中幸存下来,它们将被移交给旧的。您可以通过MaxTenuringThreshold控制此阈值。 JVM会动态调整实际使用期限阈值。

让 ’尝试借助示例来演示这种行为:
您在下面的课程中,我正在其中创建短暂的对象以进行演示。

当您运行程序时。让’在Visual GC中检查内存分配(visualVM插件)

S0AndEdenDemonstation-1024x422

如您所见,S0中只有很少的对象,并且一旦eden空间被完全填充,所有引用的对象都将移至S1。

S1FilledAndEden演示


老一辈

  • 它用于保存旧的长期存活的物体
  • 它通常比年轻一代大。
  • 当使用对象的占位空间完全填充(或预定义的阈值)时,将发生Major GC。它将回收内存并释放空间。
  • 通常,主要GC的速度比次要GC的慢且频率较低。

您如何使用此信息来优化内存?
这取决于应用程序的性质。
如果您有很多临时对象,那么会有很多次要gc。您可以提供参数XX:NewRatio = 1将50%分配给年轻一代,将50%分配给老年人。
默认情况下,NewRatio = 2,因此年轻的Generation是总堆的1/3。
同样,如果您有太多的长寿命对象,则可能需要通过设置高NewRatio值来增加保有权空间的大小。

为什么要有两个幸存空间?

您一定想知道为什么我们有2个幸存者空间。我们有2个幸存者空间以避免内存碎片。每次将对象从eden复制到幸存者时,都会得到空的eden空间和1个空的幸存者空间。


垃圾收集算法

JVM为年轻一代和老一代提供了几种算法。有3种算法

串行收集器

它使用单线程执行所有垃圾收集,并且适合于具有单处理器机器的基本应用程序。

串行GC

并联收集器

它使用多个CPU来执行垃圾收集器。串行收集器使用1个线程执行GC,而并行GC使用多个线程执行GC,当有足够的内存和足够多的内核时,这很有用。

并行GC

并发收集器

并发收集器使用应用程序线程执行垃圾收集。对于中型到大型数据集且需要快速响应时间的应用程序很有用。

并发GC

您可以为年轻一代和老一代使用不同的GC算法,但只能配对兼容的算法。

例如:您不能将年轻代的Parallel Scavenge与旧的并发标记扫描配对,因为并行Scavenge无法提供CMS所需的同步。

这是垃圾回收器,可用于年轻人和老年人。

青年收藏家老收藏家JVM选项 
序列号(DefNew)串行标记扫描紧凑-XX:+ UseSerialGC
并行清理(PSYoungGen)串行标记扫描紧凑型(PSOldGen)-XX:+ UseParallelGC
并行清理(PSYoungGen)并行Mark-Sweep-Compact(ParOldGen)-XX:+ UseParallelOldGC
序列号(DefNew)并发标记扫描-XX:+ UseConcMarkSweepGC 
-XX:-UseParNewGC
平行(ParNew)并发标记扫描-XX:+ UseConcMarkSweepGC 
-XX:+UseParNewGC
G1-XX:+ UseG1GC

之后,垃圾收集器发生了很多变化 Java 8,我将在下一篇文章中尝试介绍它们。

如果您对本文有任何建议,请发表评论。

相关文章

Comments

  1. 好文章。继续走吧..

    请分享有关系统设计的文章,例如分析和设计的重要性以及如何使用Java技术栈从头开始进行构建

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

订阅我们的新闻

获取质量教程到您的收件箱。现在订阅。