JVM GC

什么时候会GC

GC 一般发生在内存不够,这所说的内存不够是指连续的内存块不够运行

GC器类型

目前常用的GC回收期有 Serial/Parallel/CMS/G1,

我们目前JVM内存一般是分代回收,各个代根据功能采用了不同的GC回收器,直接使用一张非常直观的网上图片

 

GC类型

不同的代分为不同的GC类型,一般我们把年轻代叫young GC, 老年代叫old GC;

有些说法是,年轻代叫Minor GC,老年代叫Major GC;

年轻代GC

设置年轻代的目的是为了快速回收一些临时对象,遵循原则是少量多次,减轻持续运行创建对象对内存的需求压力;

年轻代的GC主要会考虑效率问题,速度要快,利用率高;

所以一般年轻代采用复制清理,采用空间换时间来提高回收效率;

老年代GC

老年代是为了存储短时间内运行上下文还需要用到的对象,或者常驻内存的对象;

老年代注重的是内存管理,性能高,不影响整个应用的运行,可持续优化(返回慢慢回收也不影响应用);

老年代一般采用标记清除或者标记整理;

年轻代对象何时刷新到老年代

年轻代对象刷新到老年代有一系列规则:

a、对象年龄的限制,这个跟TargetSurivivor设置相关,系统会根据TargetSurivivor(默认50%) 和 survivor区的大小算出一个数据,只要一次Minor GC(Eden区内存不够就会触发),系统就会统计从age为1的对象大小,超过计算出的TargetSurivor的大小就刷新到老年代;

b、当对象大小超过PretenureSizeThreshold 设置的大小,就会直接在老年代分配对象;

老年代对象与年轻代对象关联

老年代对象可能会使用(引用)年轻代的对象,所以老年代的对象和年轻代的对象可能会有关联关系;

在年轻代GC时需要查询是否在老年代中有对象的引用,为了提高效率JVM采用了Card marking (卡片标记)的方式;

卡片标记:将内存块分为大小为512b的区块,卡片中如果有对象引用了年轻代的对象,那么就标记卡片为脏卡片(dirty card),在做年轻代GC时就只需要扫描dirty card;

posted @ 2019-02-14 21:26  lion_eagle  阅读(134)  评论(0编辑  收藏  举报