执行GC时,JVM会遍历 Activity 对象,并清除未标记的对象。

根据:
How to Tune Java Garbage Collection

“Full GC的执行时间比Minor GC的执行时间相对更长”

会一直这样吗?

如果我们在“旧世代”空间中有约100个对象,而在伊甸园空间中的 Activity 对象(创建对象和清除对象)的平均数量超过100个,那是否仍然正确?

另外,假设我们执行紧凑阶段,则经验法则说,与复制大量小尺寸对象相比,复制少量大尺寸对象要获得更好的性能。

那我在这里想念什么?

最佳答案

“Full GC的执行时间比Minor的执行时间相对更长
GC”

是。

发生垃圾收集时,内存分为几代,即保存不同年龄对象的单独池。几乎所有最常用的配置都使用两个世代,一个用于年轻对象(Young Generation),一个用于旧对象(Old Generation)

可以使用不同的算法在不同的世代中执行垃圾收集,每种算法都是基于针对该特定世代的通常观察到的特性进行优化的。

分代垃圾收集利用以下观察结果,即以弱分代假设为基础的有关以几种编程语言(包括Java编程语言)编写的应用程序的观点:

  • 大多数分配的对象很长时间都没有被引用(认为是实时存在的),也就是说,它们死于年轻的
  • 中几乎没有从较旧的对象到较年轻的对象的引用。

  • 年轻一代的收集相对频繁,并且高效且快速,因为年轻一代的空间通常很小,并且可能包含许多不再引用的对象。

    在许多年轻一代收藏中幸存下来的物品最终被提升或保留给老一代。

    java - 为什么老一代的gc比年轻一代的gc需要更长的时间-LMLPHP

    这一代人通常比年轻一代及其入住人数大
    生长更慢。结果,旧的收藏很少见,但需要花费更长的时间才能完成。


    由于年轻一代的收集很频繁,因此为年轻一代选择的垃圾收集算法通常会提高速度。

    另一方面,老一代通常由算法来管理
    这是更节省空间的,因为老一代占用了大部分堆,老一代算法必须在低垃圾密度下工作良好。

    阅读此white paper以获得更好的理解。以上内容从此处引用。

    10-08 03:12