【问题标题】:Garbage Collection in Old Generation part in JavaJava中老年代的垃圾收集部分
【发布时间】:2014-09-13 19:12:32
【问题描述】:

来自 Oracle 文档:

老年代用于存储长期存活的对象。

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

最终需要收集老年代。此事件称为重大垃圾回收。

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

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

对于这一行:'通常主要收集要慢得多,因为它涉及所有活动对象。'

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

【问题讨论】:

  • 人们确实需要明白,这样的讨论经常在一般性和具体性之间来回切换(当您看到更大的上下文时,通常可以理解这种差异),以及一般的“概念”描述这种事情的运作方式往往与现实不符。

标签: java garbage-collection


【解决方案1】:

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

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

什么时候去碰垃圾

实际上从来没有:一个全面的收藏家是这样工作的:

  • 它找到所有生命对象
  • 将它们移到别处
  • 更新所有对它们的引用

剩下的是空闲内存。垃圾只是留在那儿,没有人关心。

这是小收集效率的关键。大多数物体都会在年轻时死去,并且只接触幸存者,开销很小。

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

【讨论】:

  • +1 实际上,次要集合专门处理活动对象。垃圾本身根本不被碰。
  • 那么,垃圾什么时候被碰?这行是有道理的:垃圾收集的过程涉及扫描所有活动对象以找到死对象。
  • 如果垃圾没有被触摸就留在那儿,那不是很消耗内存吗。
  • @ShirgillAnsari 我写道这是免费内存!分配内存时,包括垃圾在内的整个区域都会被覆盖。您清理垃圾填埋场,并可以在该地区建造房屋或任何东西。这听起来不真实,但垃圾只不过是空闲内存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
  • 2011-02-25
相关资源
最近更新 更多