当我们说垃圾收集器或GC收集对象时,JVM或内存级别会发生什么?

时间:2014-01-02 09:53:00

标签: java garbage-collection jvm

当我们说对象被GC收集时。它在后台真正做了什么?它是否删除了特定对象占用的所有数据?或者只是将对象使用的内存区域标记为“可重用”,这样每当创建新对象时,它们都会被覆盖在这个内存区域上?

6 个答案:

答案 0 :(得分:1)

将检查堆内存以识别正在使用但未使用的对象。 将删除未使用的对象。

将回收未引用对象使用的内存。

答案 1 :(得分:1)

memoris被映射为与垃圾收集器一样的树。在垃圾收集之后,从树中移除存储器的链接(即树的节点)。因此,如果存在与gc根没有连接的节点,则意味着这些存储器是免费的。那些可以被其他用法使用。

用单句描述实际上很难,而不是重新发明轮子我建议你阅读以下链接,了解gc是如何工作的

http://javabook.compuware.com/content/memory/how-garbage-collection-works.aspx.http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/garbage_collect.html

答案 2 :(得分:1)

垃圾收集是查看堆内存,识别正在使用哪些对象和未使用哪些对象以及删除未使用对象的过程。使用中的对象或引用的对象意味着程序的某些部分仍然维护指向该对象的指针。程序的任何部分都不再引用未使用的对象或未引用的对象。因此,可以回收未引用对象使用的内存。

从对象分配行为中学习的信息可用于增强JVM的性能。因此,堆被分解成更小的部分或代。堆部分是: Young Generation, Old or Tenured Generation, Permanent Generation

enter image description here

Young Generation 是分配和老化所有新对象的地方。当年轻一代填满时,这会导致轻微的垃圾收集。假设高对象死亡率,可以优化次要集合。很快就会收集到充满死亡物体的年轻一代。一些幸存的物体会老化并最终移动到老一代。

停止世界事件 - 所有小型垃圾收集都是“停止世界”事件。这意味着在操作完成之前,所有应用程序线程都将停止。小垃圾收集总是停止世界事件。

旧代用于存储长期幸存的对象。通常,为年轻代对象设置阈值,并且当满足该年龄时,对象被移动到旧代。最终需要收集老一代。此事件称为主要垃圾回收。

重大垃圾收集也是阻止世界事件。通常,主要集合会慢得多,因为它涉及所有活动对象。因此,对于响应式应用程序,应尽量减少主要的垃圾收集。另请注意,主要垃圾收集的Stop the World事件的长度受到用于旧代空间的垃圾收集器类型的影响。

永久代包含JVM描述应用程序中使用的类和方法所需的元数据。 JVM在运行时根据应用程序使用的类填充永久代。此外,Java SE库类和方法可以存储在这里。

如果JVM发现不再需要它们,则可能会收集(卸载)类,并且其他类可能需要空间。永久世代包含在完整的垃圾收集中。

有关详细说明,请参阅此链接Garbage Collector

答案 3 :(得分:0)

当触发垃圾收集并且该内存可供使用时,将删除未引用的对象。

答案 4 :(得分:0)

回收并使用它的记忆

  

程序的任何部分都不再引用未使用的对象或未引用的对象。因此,可以回收未引用对象使用的内存。

A pictorial here by oracle

答案 5 :(得分:0)

  

是否删除了特定对象占用的所有数据?要不就   将对象使用的内存区域标记为“可重用”,以便每当新的时候   如果创建了对象,它们将被覆盖在这个内存区域上?

我对此并不完全确定,但我的猜测只是将 标记 内存块作为 空闲块 并将其添加到 免费池中以供重复使用 。为什么要通过清理数据来支付这么多费用,而这些数据无论如何都会被其他对象覆盖。

清洁和再次写作需要两倍的时间。