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

Java 当我们说对象由垃圾收集器或GC收集时,JVM或内存级别会发生什么?,java,garbage-collection,jvm,Java,Garbage Collection,Jvm,当我们说对象是由GC收集的时候。它在后台真正做什么?它是否删除特定对象占用的所有数据?或者只是将对象使用的内存区域标记为“可重用”,这样每当创建新对象时,它们都会被覆盖到此内存区域?将检查堆内存,以识别正在使用和未使用的对象。 未使用的对象将被删除。 将回收未引用对象使用的内存。触发垃圾回收时,将删除未引用对象,并且该内存可供使用。回收的内存将被进一步使用 程序的任何部分都不再引用未使用的对象或未引用的对象。因此,可以回收未引用对象使用的内存 内存被映射为带有垃圾收集器的树。垃圾收集后,从树中删

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

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


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

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

回收的内存将被进一步使用

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


内存被映射为带有垃圾收集器的树。垃圾收集后,从树中删除内存链接(即树的节点)。因此,如果有一个节点与gc根没有连接,这意味着这些内存是空闲的。这些可用于其他用途

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

它是否删除特定对象占用的所有数据?或者只是 将对象使用的内存区域标记为“可重用”,以便在新的 创建对象后,是否会覆盖此内存区域中的对象

我不完全确定这一点,但我的猜测是将内存块标记为可用块,并将其添加到可用池中以供重用。当数据无论如何都会被其他对象覆盖时,为什么要花这么多钱来清理数据呢


清理和再次写入将花费两倍的时间。

垃圾收集是查看堆内存、确定哪些对象正在使用,哪些没有使用,以及删除未使用的对象的过程。正在使用的对象或引用的对象表示程序的某些部分仍然保持指向该对象的指针。程序的任何部分都不再引用未使用的对象或未引用的对象。因此,可以回收未引用对象使用的内存

从对象分配行为中学到的信息可以用来提高JVM的性能。因此,堆被分成更小的部分或几代。堆部分是:
年轻一代、老一代或终身一代、
永久一代

年轻一代是分配和老化所有新对象的地方。当年轻一代填满时,这会导致较小的垃圾收集。假设对象死亡率较高,则可以优化次要收集。年轻一代的尸体很快就被收集起来了。一些幸存下来的物体会老化,最终会转移到老一代

停止世界事件-所有次要垃圾收集都是“停止世界”事件。这意味着所有应用程序线程都将停止,直到操作完成。较小的垃圾收集总是阻止世界事件

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

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

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

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


有关更多说明,请参阅此链接

它只是将内存区域标记为可重用。“没有别的了。”大卫万岁,谢谢。但问题答案中的一个链接解释了“没有明确的删除,操作系统也没有内存。”问题只是,嗯,在这种情况下,“删除”是什么意思?是的,这根本不能回答问题。我想投赞成票和反对票。它写得很好,非常清晰,这里有很多非常好的信息。但老实说,它并没有回答这个问题。本文中的compuware.com链接解释了我所寻找的“当对象不再使用时,垃圾收集器回收底层内存,并将其重新用于将来的对象分配。这意味着没有显式删除,也没有内存返回给操作系统。”