标签:mamicode 运行 分配 ret 年龄 cms 慢慢 内存管理 限制
什么时候会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;
标签:mamicode 运行 分配 ret 年龄 cms 慢慢 内存管理 限制
原文地址:https://www.cnblogs.com/souyoulang/p/10345111.html