-
分代回收算法其实是这样的,根据对象的特点进行选择,在jvm中,年轻代适合使用复制算法,老年代适合使用标记清除或者标记压缩算法。
-
这种算法的主要思想就是将内存 划分为不同的几块 然后根据各个年到的特点采用最适当的收集算法。在新生代 每次垃圾回收时 都有大批量的对象死去,只有少量存活那就采用–复制算法。而老年代因为存活率较高 采用标记清除 或者标记整理算法来分配空间。
-
分代收集算法,并不是一个新的算法,它是采用了标记-整理算法和复制算法进行一个结合,我们说内存分新生代和老年代,针对新生代和老年代不同的特点,就采用分代收集算法就可以了,就是说,分代收集算法,它根据内存的分代,选择不同的垃圾回收算法,也就是说,它会针对新生代或者所谓的内存回收率较高的这么一种内存区域,它会选择复制算法,如果对于老年代或者说内存回收率比较低的,那么,它会选择标记整理算法,这就是分代收集算法的原理。
-
jvm 分代回收算法通俗理解【引用】https://www.cnblogs.com/zgghb/p/6428395.html
jvm区域总体分两类,heap区和非heap区。heap区又分:Eden Space(伊甸园)、Survivor Space(幸存者区)、Tenured Gen(老年代-养老区)。 非heap区又分:Code Cache(代码缓存区)、Perm Gen(永久代)、Jvm Stack(java虚拟机栈)、Local Method Statck(本地方法栈)。
HotSpot虚拟机GC算法采用分代收集算法:
1、一个人(对象)出来(new 出来)后会在Eden Space(伊甸园)无忧无虑的生活,直到GC到来打破了他们平静的生活。GC会逐一问清楚每个对象的情况,有没有钱(此对象的引用)啊,因为GC想赚钱呀,有钱的才可以敲诈嘛。然后富人就会进入Survivor Space(幸存者区),穷人的就直接kill掉。
2、 大对象直接近入老年代-养老区:有些世界土豪出生。 他父母直接砸了几百亿, 身份显赫, 进入老年代,有钱就是嚣张!不用去Eden Space(伊甸园)。
3、Survivor Space(幸存者区有两个区域:生活区和无人区)为什么有两个区 from Survivor(生活区) ,to Survivor(无人区) .每次GC想要去幸存者区敲诈 ,会去from Survivor(生活区的)所有人带到to Survivor(无人区) ,然后开始敲诈, 被敲诈包括本次15次 的土豪,进入养老区,交不起保护费 的杀死, 没满足15 次,但是手里还有点钱的就生活在无人区,这个无人区就变成了生活区, 以前的生活区(人都被移走了) 又变成了无人区
4、并不是进入Survivor Space(幸存者区)后就保证人身是安全的,但至少可以活段时间。
GC会定期(可以自定义)会对这些人进行敲诈,亿万富翁每次都给钱,GC很满意,就让其进入了Genured Gen(养老区)。
(每经过一次Minor GC,会给这个富翁添加一次记录,当某些富翁连续给了大概15 年保护费,就可以去养老区了)万元户经不住几次敲诈就没钱了,GC看没有啥价值啦,就直接kill掉了。
5、进入到养老区的人基本就可以保证人身安全啦,但是亿万富豪有的也会挥霍成穷光蛋,只要钱没了,GC还是kill掉。
分区的目的:
标记-清理算法:新生区由于对象产生的比较多并且大都是朝生夕灭的,所以直接采用标记-清理算法(穷鬼们直接砍死, 发现你没钱了,直接一刀拜拜,所以用标记-清理)。
复制算法:养老区生命力很强,则采用复制算法 (富豪们交给很多钱了,但是这次又没钱了, 因为以前打点 的好, 和上面关系硬 ,不能直接杀了他,所以找个借口说,我们为大家组织一次海上旅游,当然都是那些交不起保护费的,然后安排一个海上事故, 这些把钱挥霍完的富豪也死翘翘了)
非heap区域中Perm Gen中放着类、方法的定义,jvm Stack区域放着方法参数、局域变量等的引用,方法执行顺序按照栈的先入后出方式
JVM垃圾回收之分代算法
最新推荐文章于 2024-07-06 16:27:53 发布