最近一段时间,垃圾分类很火,原因是人们发现扔垃圾这件小事,竟然没想象中那么简单。
以前不管什么垃圾,都是一股脑全扔在一起,现在倒好,要分什么干垃圾、湿垃圾、有害垃圾和可回收物,这都是什么鬼啊,为啥要搞那么复杂~
看到这里的同学,肯定会以为我接下来会讲,如何区分这些分类吧?NONONO!我要讲的是在计算机世界,如何进行垃圾回收(GC即Garbage Collection)。
咱们先来看一个段子吧,是说你到过的餐厅里边,其实都只能分为两种,一种是吃完需要自己端盘子的,另外一种就是吃完直接走人,由专门的服务员来收拾盘子的,这其实就是两种回收机制。在编程界,前一种机制的代表语言是C++,后一种则是Java。
今天我们主要聊的就是,Java是如何对内存进行垃圾回收的,咱们先看图
从图中可以得出,Java堆内存是分区进行管理的,主要分为2个区域-年轻代与老年代,其中年轻代又分 Eden 区和 Survivor 区,其中 Survivor 区又分 From 和 To 2个区。可能这时候大家会有疑问,为什么要分这么多区,搞那么复杂(感觉和现实中垃圾分类好像哦,都挺复杂)~
不要急,我们慢慢来看,年轻代从字面意义上来讲,主要存放一些新建(刚出生)不久的对象,老年代则存放的是,生命周期比较长的对象,中间的Surivor区是二者的过渡区,也可以理解为加一层保险,以防漏网之鱼。
为什么要分区,其实这是经过了多年摸索,才演化总结出来的方法,之前对所有对象大一统的方法,不管怎样总是有这样和那样的缺陷,最后发现分区才是最适合的方法。
每个区的处理机制不一样,比如年轻代垃圾回收会更频繁,老年代则很久才会做一次回收,根据对象的不同生命周期分而治之,就像韦小宝一样,见人说人话,见鬼说鬼话,最后黑白两道通吃,到哪都有兄弟,还抱得众美人归。
毫不夸张的说,正是由于采用了合理的垃圾回收机制,计算机程序才能做到,长时间的不宕机稳定运行,也才能有如今如火如荼的互联网产业。
别的不谈,单从计算机垃圾回收目前的机制来看,咱们在现实生活中实施垃圾分类,长远来看是正确的做法,因为只有分类了,才能快速找到最适合它的处理方式。