【发布时间】:2018-12-03 16:09:26
【问题描述】:
为了针对这种情况进行优化,内存是分代管理的(内存池保存不同年龄的对象)。当代填满时,垃圾收集发生在每一代中。绝大多数对象都分配在专用于年轻对象(年轻一代)的池中,并且大多数对象都死在那里。 GC如何为不使用任何对象的对象定义时间到正在运行的程序中? GC如何决定将对象从年轻代移动到老年代?
【问题讨论】:
-
首先,垃圾收集器通常在没有足够的可用内存来服务实际分配请求时运行。一些垃圾收集器还允许为正在使用的内存配置阈值,以触发收集。在任何一种情况下,触发任何事情的不是垃圾(未使用的对象)的数量,因为在垃圾收集器运行之前该数量是未知的。从年轻到老的提升通常是通过一个简单的计数器来实现的。在一个对象在可配置数量的集合中存活后,它会被提升到老年代。
-
您好 Holger,我认为 GC 在后台运行并迭代对象以推送到老一代或年轻一代。如果对象不可达,内存池会跟踪并通知 GC,在复制内存期间 GC 未收集到时将删除对象。但是在将其移除之前,无法访问的对象保留了多长时间。例如:我们定义 10 纳秒,然后收集。但是如果 10 纳秒后,程序再次收集对象,对象变为可达,那么 GC 是如何解决这个问题的呢?
-
你对垃圾回收有一个根本性的错误理解。首先,一个不可访问的对象永远不会再变得可访问,这就是不可访问的全部意义所在。应用程序无法访问它,因此,应用程序无法更改其状态。其次,垃圾收集是确定哪些对象仍可访问(反之,哪些对象不可访问)的过程。没有人告诉垃圾收集器无法访问的对象,因为在垃圾收集器运行之前没有人知道。一旦确定,就没有理由保留无法访问的对象。
-
谢谢霍尔格。我得到了它。非常感谢。
-
您好 Holger,我阅读了 Mark and Sweep 算法,其中提到了 GC 检测不可达对象的方式以及回收堆空间以使空间再次可用的方式。如果我的应用程序因为 GC 运行而挂起,我们是否有任何解决方案可以在不重启 JVM 的情况下终止 GC?