垃圾收集 - 老一代

问题描述:

我正在学习垃圾收集如何工作。垃圾收集 - 老一代

我与年轻一代清楚,但与老一代

当老一代已满,进行重大GC然后会发生什么?

所有对象是活的还是死的都从老一代中删除,或者只有已死的对象被删除?

如果老一代中的所有对象在主要gc时都是活的,那么会发生什么?它会抛出OutOfMemoryError吗?

年轻一代:大部分新创建的对象都位于此处。由于大多数物体很快变得无法到达,许多物体在年轻一代中被创造出来,然后消失。当物体从这个区域消失时,我们说发生了“次要GC”。

老一代:从年轻一代没有变得无法达到并幸存的物体被复制到这里。它通常比年轻一代大。由于它的规模较大,GC的发生频率比年轻一代少。当物体从旧一代消失时,我们说“主要GC”(或“完整GC”)已经发生。

oldgen:这个池基本上包含tenured和虚拟(保留)空间,并将持有从YoungGen空间垃圾收集后幸存下来的那些对象。

如果老一代变满了,将会抛出OOM

Q & A 

当老一代已满并且执行主要gc时会发生什么? Objects are removed from memory.

所有对象是活的还是死的都从老一代中删除或者只有已死的物体被删除? only dead objects are removed, objects which are still referenced still live in old

如果老一代的所有物体都是活的,那么会发生什么?

Does it throws OutOfMemoryError? OOM will be thrown 

只有那些不可达的对象才会被GC删除。 所以是的,如果旧代堆中的所有对象都可以访问,JVM将抛出OutOfMemoeryError。

老一代:未成为不可达,从年轻一代幸存的对象复制到此处。它通常比年轻一代大。由于它的规模较大,GC的发生频率比年轻一代少。当物体从旧一代消失时,我们说“主要GC”(或“完整GC”)已经发生。

您可能会看到here了解更多详情。

+0

好的..谢谢.. !! :) – Devloper

+0

如果我想删除该错误,那么是否有任何方式通过编码? – Devloper

+0

没有办法通过编码来处理OutOfMemory。请记住,可以处理异常,但不能处理错误。但是,您可以为应用程序配置JVM参数,以便在应用程序崩溃时获取堆转储。你也可以调整应用程序的堆大小,以便这种情况不会发生在第一位。 – Batty