garbage-collection - 年轻代中的JVM垃圾收集

标签 garbage-collection jvm

如果我错了,请随时纠正我。在JVM堆中,有两代,老的和年轻的。在做full GC的时候,老年代会有一些繁重的操作,比如紧空间、补洞等,会导致JVM挂掉。而且我发现在年轻代中,应用了轻量级GC,并且从我的搜索结果中还有另一个名为Eden的区域涉及年轻代。但是,查了很多文档,对于年轻代GC还是有两个困惑,

  • 在年轻代中,GC 似乎不像老年代 GC 那样工作(即老年代 GC 压缩并修复漏洞)?如果是这样,年轻代的GC是如何工作的?
  • 什么是 Eden 空间以及这个空间如何在年轻代中被利用?感谢是否可以推荐任何适合新手的文档。
  • 最佳答案

    这是您必须记住和理解的唯一、最重要的图表:
    Java memory layout
    (来源:oracle.com)
    它来自 Java SE 6 HotSpot[tm] Virtual Machine Garbage Collection Tuning ,一站式了解 GC 内部的一切。但要解决您的直接问题:
    使用 new 分配新对象运算符 ( almost ) 总是发生在 Eden 空间中。但伊甸园实际上是一个堆栈。当您创建需要 N 个字节的新对象时,单个指针在该堆栈上前进 N 个字节,仅此而已。分配就是那么快,不需要搜索空闲位置,压缩等等。
    当然,这个堆栈不是无限的,在某个时候我们会到达它的尽头,触发次要 GC。也很可能多个对象已经是垃圾。那么JVM在minor GC中的作用如下:

  • 从 GC 根开始的对象遍历图
  • 将所有从 GC 根可到达的对象复制到幸存者空间之一(没有间隙,我们知道所有这些,这是一个单一的过程)
  • 清除伊甸园空间(基本上只是将此堆栈指针移回 0 )

  • 在随后的小集合中,还有额外的步骤:
  • 幸存者空间之一也被检查。来自伊甸园和幸存者空间之一的事件对象被复制到第二个幸存者空间。这意味着总是只有一个空闲的幸存者空间。

  • 那么对象如何以年老代结束呢?第一个年轻对象被复制到幸存者空间之一。然后他们一次又一次地复制到另一个。一旦给定的对象来回跳跃太多次(可配置,默认为 8),它就会被提升到终身空间。
    当终身空间已满时,主要 GC 运行。

    关于garbage-collection - 年轻代中的JVM垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13660871/

    相关文章:

    java - 对 Java 的垃圾收集器如何工作的困惑(节点 + 队列)

    Chrome 中类型化数组的 Javascript 垃圾回收

    Java 平台 - 目前有哪些可用?

    java - 无法识别的虚拟机选项

    java - Kotlin 中的哪些语言功能可能导致内存泄漏?

    java - 保持 JVM 在 iseries 上运行

    C# 垃圾收集器、线程和编译器/抖动优化

    java - 如何确定 JNI 全局引用内存泄漏的原因?

    java - jvm8 中的元空间大小是多少?

    windows - java.net.SocketException : No buffer space available (maximum connections reached? ): JVM_Bind