Java 终身满,伊甸园空:对象可以移动到伊甸园吗?

Java 终身满,伊甸园空:对象可以移动到伊甸园吗?,java,garbage-collection,Java,Garbage Collection,我试图了解Java中的GC是如何工作的,我想知道在以下情况下会发生什么: 伊甸园:几乎满了,生存1:一些最低利用率,生存2:空,终身:几乎满了 我们试图分配一些不适合伊甸园自由空间的对象 GC启动:尝试将Eden+Survivor1重新打包到Survivor2中。删除了大多数对象,但仍然没有足够的空间。溢出效应试图进入终身制 终身制也没有足够的空间来保持所有的溢出效应 在这一点上,在删除死物之后,伊甸园可能已经有了足够的空间。JavaGC可以利用这个空闲空间吗 在这个问题上,我没有考虑G1垃圾收

我试图了解Java中的GC是如何工作的,我想知道在以下情况下会发生什么:

  • 伊甸园:几乎满了,生存1:一些最低利用率,生存2:空,终身:几乎满了

  • 我们试图分配一些不适合伊甸园自由空间的对象

  • GC启动:尝试将Eden+Survivor1重新打包到Survivor2中。删除了大多数对象,但仍然没有足够的空间。溢出效应试图进入终身制

  • 终身制也没有足够的空间来保持所有的溢出效应

  • 在这一点上,在删除死物之后,伊甸园可能已经有了足够的空间。JavaGC可以利用这个空闲空间吗


    在这个问题上,我没有考虑G1垃圾收集器。

    在您描述的情况下,一个典型的GC算法(因为您没有询问具体的算法)会导致一个主要GC尝试回收旧gen(终身空间)中的空间,以允许从Eden/survivor空间提升对象


    如果这不能回收足够的空间来支持年轻一代完成GC,那么您将得到一个OutOfMemoryException。

    将对象从Tentered移动到Eden将是一个逻辑矛盾。但是,至少一些可选算法可以调整代的大小(对于大多数代,可配置,默认情况下可调整大小),这已经是一种利用此空间的解决方案,而无需移动对象。因此,这将是使年轻空间变小的一个理由?这实际上取决于应用程序的配置文件。如果减少年轻一代的规模,JVM将不得不更频繁地执行小型GCs,这将降低应用程序的吞吐量。当然,如果在强制阈值达到之前强制对象被提升,可以考虑使生存空间更大。不幸的是,这种调音与其说是一门科学,不如说是一门黑色艺术。我们使用C4 GC的Zing JVM解决了很多这样的问题:-)。我的意思是,在许多支持/反对年轻空间小的论点中,这一个应该是“赞成”。