# JavaGC **Repository Path**: kitesMaker/JavaGC ## Basic Information - **Project Name**: JavaGC - **Description**: JavaGC - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-10-08 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### jvm自动GC执行的判定: 1.YoungGen内存的eden区满了之后执行minor gc 2.晋升到老年代的实例的实际大小大于老年代的剩余空间大小时执行major gc 3. minor gc前,系统确认:老年代最大可用连续空间小于历次晋升到老年代的对象的平均大小,或者参数HandlePromotionFailure=false(空间分配担保),执行full gc。(设置为true可以减少——实际晋升对象小于老年代可用连续空间却被强制full gc的情况。) ### Minor GC: 指发生在新生代的垃圾收集动作,因为 Java 对象大多都具有朝生夕灭的特性,因此Minor GC 非常频繁,一般回收速度也比较快。 新生代通常存活时间较短基于Copying算法进行回收,所谓Copying算法就是扫描出存活的对象,并复制到一块新的完全未使用的空间中,对应于新生代,就是在Eden和FromSpace或ToSpace之间copy。当连续分配对象时,对象会逐渐从Eden到Survivor(from space+to space),最后到老年代。 ### Full GC/Major GC: 发生在老年代的 GC,通常会伴随至少一次 Minor GC。由于老年代中的对象生命周期比较长,因此 Major GC 并不频繁,一般都是等待老年代满了后才进行 ,而且其速度一般会比 Minor GC 慢 10 倍以上。 由于老年代对象存活的时间比较长、比较稳定,因此采用标记(Mark)算法来进行回收,所谓标记就是扫描出存活的对象,然后再进行回收未被标记的对象。回收后对用空出的空间要么进行合并、要么标记出来便于下次进行分配(总之目的就是要减少内存碎片带来的效率损耗)。 ### Stop-The-World 由gc的机制,我们可以发现,实际gc过程经常涉及到实例对象的挪动,而后再对对象引用进行更新(内存中的地址)。为了保证引用更新的正确性,Java将暂停所有其他的线程,这种情况被称为“Stop-The-World”,导致系统全局停顿,并且堆越大、对象实例越多花的时间越长。