执行GC时,JVM会遍历实时对象,并扫描未标记的对象。
根据: How to Tune Java Garbage Collection
“Full GC的执行时间比Minor GC的执行时间长”
总是这样吗?
如果我们在旧生成空间中有~100个对象,并且伊甸园空间中的平均活动对象数(创建和扫描反对)超过100,那还是真的吗?
此外,假设我们执行紧凑阶段,那么经验法则表示为了更好的性能,复制少量大尺寸对象,而不是复制大量小尺寸对象。
那我在这里错过了什么?
答案 0 :(得分:3)
“Full GC的执行时间比Minor的执行时间长 GC“
是强>
当垃圾收集发生时,内存分为代,即包含不同年龄对象的独立池。几乎所有最常用的配置都使用两代,一个用于年轻对象(Young Generation),一个用于旧对象(旧一代)
可以使用不同的算法在不同代中执行垃圾收集,每种算法基于该特定世代的常见特征进行优化。
分代垃圾收集利用以下观察,称为弱代假设,关于用几种编程语言编写的应用程序,包括Java编程语言:
大多数已分配的对象都没有被引用(被认为是实时的),也就是说,它们已经年轻。
很少有从较旧的对象到较年轻的对象的引用。
年轻代收藏相对频繁且高效快速,因为年轻代空间通常很小,可能包含很多不再被引用的对象。
在一些年轻一代的藏品中存活下来的物品最终会被提升或保留给老一代。
这一代通常比年轻一代及其入住率更大 变得更慢。因此,老一代的收藏品很少,但需要更长的时间才能完成。
为年轻一代选择的垃圾收集算法通常会提高速度,因为年轻一代的收藏频繁。
另一方面,旧代通常由算法管理 这是更节省空间的,因为老一代占用了大部分堆,而旧代算法必须能够很好地处理低垃圾密度。
阅读此white paper以便更好地理解。上面引用了上述内容。