|
|
1
5
是的,这就是垃圾收集的重点。 垃圾收集有许多不同的形式。最简单的形式是引用计数,如果不增强算法,就无法处理某些类型的垃圾(循环引用)。 Java(Sun JVM)使用代标记和扫描收集器,虽然这不是标准化的,不同的JVM确实使用不同的收集器。我不知道.NET CLR使用的确切收集器。 垃圾收集器喜欢减少程序员的开销,并且可以使某些算法性能更好。但是,它们的内存占用通常比严格的手动分配系统要大。 关于这个话题的诽谤性引用是 book Garbage Collection 这本书写得很好,很全面。 |
|
|
2
4
不,它不能。但是,它可以收集所有 不能再使用了 它做得很好。差别很小,见下文。 解释例如,假设您有以下代码:
让我们说
你
知道一段时间后
相反,垃圾收集器收集所有对象 无法再访问 . 例如:
垃圾收集器检测到没有任何方法
这种差异是微妙的,实际上,在大多数健全的代码中,您不再使用的所有对象都将被收集起来。 集合本身是完整的,能够正确地识别和收集每个不可访问的对象 ,其中包括无法访问的对象,因为它们的所有引用都驻留在其他不可访问的对象中。 |
|
|
3
2
GarabageCollectors搜索对象并检查它们是否被有效指针引用。否则,它们将被完全移除。这就消除了一些潜在的问题,比如让活动指针引用死的对象,从而使内存中的任何东西都不做。 使用一种要求您自己分配、释放和重新分配空间的语言(如C)开始时可能非常困难,因为您需要完全控制为任何需要的对象分配空间,并在不忘记任何不需要的对象坐在某个地方耗尽空间的情况下取消分配任何对象。虽然可能很棘手,但它确实具有性能优势。 垃圾收集器倾向于在低级别上取消分配空间,这可能会损害性能。不过,对于大多数应用程序,性能下降不会很大,因此不明显。 |
|
|
4
1
垃圾收集器是实现定义的。存在着不同类型的地面军事系统;使用哪一种并不需要程序担心。 我不能说C,但是在C++中,我们很少使用一个完整的垃圾收集器,因为C++程序员有一些技术,比如RAII和引用计数智能指针,这有助于简化内存管理。 |
|
|
5
1
垃圾收集器(GC)不时运行以查找对象的引用。不带任何引用的方法首先被标记,然后调用finalize()方法。下次从内存中删除对象时。GC使程序有点慢。您可以影响GC行为,但不能保证。 |
|
|
6
1
对于.NET,请看一下 Garbage Collector Basics and Performance Hints 在这里,您还可以找到一些性能提示。 对于Java,请看 Java theory and practice: Garbage collection and performance . 在那里你也会发现一些提示和“反提示”,也就是让GC更糟的方法。 |
|
codeforester · 测量GC暂停时间的最佳方法是什么? 7 年前 |
|
|
Venki WAR · 需要解释G1的并行完整GC 7 年前 |
|
|
Stephan_Berlin · 为什么CMS系列中的初始标记阶段 7 年前 |
|
|
Bonsaisteak · 为什么年轻一代需要三个区域来收集垃圾? 7 年前 |
|
|
goks · 如何清除熊猫的数据帧内存? 7 年前 |