执行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编程语言)编写的应用程序的观点:
年轻一代的收集相对频繁,并且高效且快速,因为年轻一代的空间通常很小,并且可能包含许多不再引用的对象。
在许多年轻一代收藏中幸存下来的物品最终被提升或保留给老一代。
这一代人通常比年轻一代及其入住人数大
生长更慢。结果,旧的收藏很少见,但需要花费更长的时间才能完成。
由于年轻一代的收集很频繁,因此为年轻一代选择的垃圾收集算法通常会提高速度。
另一方面,老一代通常由算法来管理
这是更节省空间的,因为老一代占用了大部分堆,老一代算法必须在低垃圾密度下工作良好。
阅读此white paper以获得更好的理解。以上内容从此处引用。