是什么决定了垃圾收集器何时真正收集?它是在一定时间之后还是在一定数量的内存用完之后发生的吗?还是还有其他因素?
它在确定是时候运行时运行。在世代垃圾收集器中,一种常见的策略是在第0代内存分配失败时运行收集器。也就是说,每次你分配一小块内存(大块通常直接放置在“旧”代中)时,系统都会检查gen-0堆中是否有足够的可用空间,如果没有,则运行GC释放空间以使分配成功。然后将旧数据移至第1代堆中,当空间用完时,GC会在该堆上运行一个集合,将在那里保存时间最长的数据升级到第2代堆中,依此类推。因此,GC不仅可以“运行”。它可能只在gen-0堆上运行(大多数集合都可以这样做),
但这远非唯一的策略。并发GC在后台运行,在程序运行时进行清理。某些GC可能作为每个内存分配的一部分运行。增量收集器可以做到这一点,在每次内存分配时扫描几个对象。
垃圾收集器的全部要点是,它只需要执行操作即可,而无需用户进行任何输入。因此,通常,你不能也不应预测何时运行。
我相信Suns JVM不久前就获得了一代代的GC(也许是v1.6?我已经很久没有编码Java了,所以不确定这一点,但是我记得不久前,当它的卖点之一感到惊讶)新版本是“一代世代的GC”。尤其是因为.NET从第1天起就有一个。)
当然,其他JVM可以自由选择他们喜欢的策略。
编辑:关于Java和分代GC的上述部分是不正确的。请参阅下面的更多细节:
1.0和1.1虚拟机使用了标记清除收集器,该收集器可以在垃圾收集之后对堆进行分段。从Java 1.2开始,虚拟机切换到世代收集器,该收集器具有更好的碎片整理行为(请参阅Java理论和实践:垃圾收集和性能)。
因此,Java实际上具有很长一段时间的世代GC。Java 6中的新功能是Java 6u14中提供的Garbage-First垃圾收集器(G1)。根据声称在1.6.0_14中发布的文章:默认情况下未启用。并行收集器仍然是默认的GC,并且是普通家庭使用的最高效的GC。G1是并发收集器的替代方案。它的设计更具可预测性,并可以通过内存区域设计实现快速分配。
问题内容: 我对可以控制CMS收集器启动时间的两个参数感到困惑: (默认为70%) (默认情况下超过90%) 这些参数的确切含义是什么?收集器什么时候开始(标记阶段)并收集(清扫阶段)? 问题答案: 决定何时启动CMS(为了使此选项生效,您还必须设置)。是确定世代空间大小的选项。 参见例如… http://java.sun.com/docs/hotspot/gc1.4.2/faq.html 通常无
问题内容: 据我所知,GC仅在JVM需要更多内存时才使用,但我不确定。所以,请有人提出这个问题的答案。 问题答案: 据我了解,Java的垃圾收集算法非常复杂,而且不那么直接。另外,GC可用的算法还不止这些,可以在VM启动时通过传递给JVM的参数进行选择。 这里有一个有关垃圾收集的常见问题解答:http : //www.oracle.com/technetwork/java/faq-140837.h
问题内容: 我是Java新手,对Java中的垃圾收集器感到困惑。它实际上是做什么的,什么时候生效。请描述Java中垃圾收集器的一些属性。 问题答案: 该垃圾收集器是运行在一个程序的Java虚拟机,其摆脱其未使用的Java应用程序了对象。它是自动内存管理的一种形式。 当典型的Java应用程序运行时,它正在创建新的对象,例如和,但是在一段时间之后,这些对象将不再使用。例如,看下面的代码: 在上面的代码
本文向大家介绍Java垃圾收集,包括了Java垃圾收集的使用技巧和注意事项,需要的朋友参考一下 示例 C ++方法-新增和删除 在像C ++这样的语言中,应用程序负责管理动态分配的内存所使用的内存。当使用new运算符在C ++堆中创建对象时,需要相应地使用delete运算符来处置该对象: 如果程序忘记了delete一个对象而只是“忘记”了该对象,则关联的内存将丢失给应用程序。这种情况的术语是内存泄
问题内容: 在这个主题中,我问了一个有关Java垃圾收集的问题。但是我得到的答案又给了我一个问题。 有人提到垃圾回收器也可以收集类。这是真的? 如果是真的,这是如何工作的? 问题答案: 没有任何引用时,可以对Java中的类进行垃圾回收。在大多数简单的设置中,这永远不会发生,但是在某些情况下可能会发生。 有很多方法可以使类可达,从而阻止其符合GC的资格: 该类对象仍然可以访问。 表示类的对象仍然可以
在Java中,当一个对象没有实时引用时,它就有资格进行垃圾回收。对于字符串,情况并非如此,因为字符串将进入字符串池,而JVM将保持对象活动以供重用。这意味着字符串一旦创建就永远不会被垃圾收集?