“你醒啦!”,迷迷糊糊中听到一个声音,我睁开了眼睛,发现一个小伙伴正看着我。
“这里是哪里,你是谁啊?”“这里是堆区,我是一个Ajax对象,叫我小A吧”
我慢慢坐了起来,举目四望,这里有好多形形色色的对象居住在这里,远处还有好多的线程在各自忙碌着,好一副热闹的景象!
“你好,我才刚醒,我还不知道我是什么对象呢”“这个简单,让我看看哈~~哦,原来你是一个APIController对象啊”,小A摸了摸我的头。“你怎么知道的?”
“你的头上这里有个64bit的Klass指针,喏,顺着这个方向看过去,那里记录了你所属的类信息,你看,那里写着APIController呢”
听他这么一说,我这才注意到我的头上有两个64bit的字段。
“唉,小A,旁边这个64bit的数字又是装的什么内容呢?”“那个叫MarkWord,是咱们Java对象的门面,里面的信息可重要了,你可要保管好了,这里面有。。。”
突然,不知从哪里传来一串警报声,随后听到广播:“各线程注意,请进入安全点等待,各分区注意,启动一次Minor GC”
听到广播的我莫名的紧张起来。
不知怎么回事,远处忙碌的线程们都仿佛被施了定身法一般,都停下了手头的活。只有少数几个还在活动,这几个线程大叔看上去跟他们有些不一样,其中有几个朝我们这边走了过来。
“这是要干什么啊?”我向小A打听情况。“我也不知道,我也比你先出生没多久,这情况我也是第一次见到”,小A好像也有一点慌张。
没过多久,来了一个凶巴巴的管理员线程,拿着喇叭吼着:“Eden区的对象们听着,念到名字的站起来”说完,便开始一个个点名,心里一阵忐忑,怕被叫到,又怕不被叫到。
念了很久,终于听到了小A和我的名字,我俩战战兢兢的站了起来。
没多久就念完了,我一瞅,站起来的是少数啊,心里有点不好的预感。“念到名字的跟我来,其他的交给我的助手处理”,说完大家跟着他开始移动。
在走的路上,碰上了另外一支队伍,和我们汇合了。
“唉,兄弟,怎么称呼,你们哪个单位的?”小A热情的上去和一个对象攀谈了起来。“叫我小B吧,我们这波是Survivor From区的,你们Eden区来的吧,我半小时前还在你们那儿待过呢”,这个自称是小B的也很随和。
“小B哥您好,咱们这是要去哪里啊?”我也上前搭了句话。“前面是Survivor To区”
“咱们是怎么被挑出来的?”“这里的管理员会通过一种叫GC Roots的对象,顺藤摸瓜,找出所有还有引用关系的对象,咱们就是幸存者,说明咱们还有价值”
“那留下的对象怎么办?”“他们的命运多半悬了,因为没有别的对象引用他们了,需要把他们清理掉,腾出空间来”
我似懂非懂,一边走一边担心着,很快我们就到了传说中的Survivor To区,管理员安排我们都坐下,“这里好小啊”
“那可不,比起你原来的Eden区,这里只有八分之一大小”,我一回头,刚才路上碰到的小B居然就在我和小A的旁边,巧了不是。“唉,小B哥,咱们这么折腾一圈是在做什么啊?”
“这叫做垃圾回收GC,你们开始待那地方叫Eden区,对象出生的地方都在那里。咱们所在的地方是一个叫Java Virtual Machine的世界,程序员只管创建对象,不管释放,这对象越来越多,Eden区放不下了,自然就要腾出空间来了。”
我和小A都点了点头,心里庆幸躲过一劫,抬头望去,不知什么时候,那些定住的线程们又开始忙活起来了。
“还没恭喜你们呢,长大一岁了”,小B拍了拍我俩的肩膀,我俩面面相觑,满脸问号。“这是从何说起呢?”,小A先开口了。
“你们头上的MarkWord第3-6位记录的就是你们的年龄,经过一次GC就长大一岁了!”我俩互相看了看,又看了看小B的GC年龄位置,居然已经15岁了。
“小B哥,难怪你见多识广,都一把年纪了呀。咦,这表示GC年纪的只有4位,最大只能表示到15,等会儿要是再来一次GC,这不要装不下了吗?”,看着小B的脑袋,我陷入了思考。“再来一次GC我要是还能幸存,我就要进入老年代区域了,就不能陪你们玩儿了”,小B看着我们眨了眨眼睛。
“老年代,那是什么地方,我们不能去吗?”“都说了是老年代了,是我这种老年对象去的地方,你们新来的还要在Survivor To区和Survivor From区兜兜转转好些回合呢,等你们到我这把年纪就能过去了”
“啊,为什么这么麻烦,设置这么多区都是干嘛的啊?”小A急着问。小B把手搭在小A的肩说到:“这里的管理员用的是标记-复制算法来清理空间,所以需要在Eden区之外再设一个地方接收复制活下来的对象。”
“那加一个Survivor区就够了啊,干嘛弄两个Survivor区?”我也抛了一个问题。小B把另一只手搭在了我的肩上,“这是为了让存活的对象能够在这边反复流转,不要着急去老年代区域”
“那为什么Survivor比Eden小那么多?”,我继续问到“根据他们统计发现,98%的对象都活不过一轮GC,留下来的都是少数。而且两个Survivor区有一个要空着,如果太大就太浪费了。”
听着小B的话我们俩都陷入了沉思。
没过一会儿,广播又响了起来:“各线程注意,请进入安全点等待,各分区注意,启动一次Minor GC”,刚刚平静的心又一次悬了起来。管理员又开始点名,这一次,我和小B都被点到了,而没有听到小A的名字。
我们跟小A告别了,离开了Survivor To区,走到分叉路口,小B也跟我道别:“再见了朋友,如果有机会,老年代等你来再聚”
接下来就只剩我一个对象了,跟随陌生的对象队伍来到了Survivor From区,这里跟刚才的To区规模相当,只是队伍比起之前那次又小了很多。
来到自己的位置坐好,看了看头上的GC年龄位,我2岁了。
没有了熟悉的朋友,独自发着呆,等待着线程们来访问我。突然,有人拍了拍我的肩膀,我回头看去,居然是小A,他跑的气喘吁吁的。
本文系作者在时代Java发表,未经许可,不得转载。
如有侵权,请联系nowjava@qq.com删除。