Java中旧一代部分的垃圾收集

Java中旧一代部分的垃圾收集,java,garbage-collection,Java,Garbage Collection,从Oracle文档: 旧一代用于存储长期存活的对象 通常,会为年轻一代对象设置一个阈值,当满足该年龄时,对象将移动到老一代 最终老一代需要被收集起来。此事件称为主要垃圾回收 通常,主集合的速度要慢得多,因为它涉及所有活动对象。 因此,对于响应迅速的应用程序,应尽量减少主要的垃圾收集 顾名思义,这里的垃圾指的是未引用的对象(不再需要的对象) 这句话的意思是:“通常一个主要的收集要慢得多,因为它涉及所有的活动对象。” 活动对象是指引用仍然存在的对象。那么,为什么一个主要的集合包含活动对象呢?(主要收

从Oracle文档:

旧一代用于存储长期存活的对象

通常,会为年轻一代对象设置一个阈值,当满足该年龄时,对象将移动到老一代

最终老一代需要被收集起来。此事件称为主要垃圾回收

通常,主集合的速度要慢得多,因为它涉及所有活动对象。 因此,对于响应迅速的应用程序,应尽量减少主要的垃圾收集

顾名思义,这里的垃圾指的是未引用的对象(不再需要的对象)

这句话的意思是:“通常一个主要的收集要慢得多,因为它涉及所有的活动对象。”


活动对象是指引用仍然存在的对象。那么,为什么一个主要的集合包含活动对象呢?(主要收集必须只涉及死对象)。

与真正的实时垃圾收集不同,Java GC主要处理活对象。这更像是扔掉一个垃圾填埋场,捡起所有需要的东西

原因是没有直接的方法来识别垃圾。我们所知道的是,找到一个对象的活引用意味着它不是垃圾

垃圾什么时候会被碰

实际上从来没有:清扫收集器的工作原理如下:

  • 它找到了所有的生命物体
  • 把它们移到别处
  • 更新对它们的所有引用
剩下的是空闲内存。垃圾就留在那里,没人在乎

这是提高小型收集效率的关键。大多数物体都很年轻就死去了,只接触幸存者,头顶上的物体很小


除了带有
finalize
或引用队列的对象之外,死对象永远不会被触及。除非你真的知道自己在做什么,否则不要使用
finalize
。你永远不能依赖它。

+1事实上,次要收藏只处理活动对象。垃圾本身根本不会被碰。那么,什么时候才能碰垃圾呢?这句话很有道理:垃圾收集的过程包括扫描所有活动对象以找到死亡的对象。如果垃圾停留在那里而不被触及,这不是会消耗大量内存吗?@ShirgillAnsari我写道这是自由内存!当分配内存时,包括垃圾在内的整个区域将被覆盖。你可以清理垃圾填埋场,然后在该地区建造房屋或其他任何东西。这听起来不真实,但垃圾不过是免费的内存。我们确实需要了解,这样的讨论经常在一般性和具体性(当你看到更大的背景时,通常可以理解这一差异)和一般的“概念性”之间来回切换对这类事情如何运作的描述往往与现实不符。