你是什么垃圾?
“警告!内存即将溢出!”变量大厅已经挤到半只脚悬空,JavaScript 老大冲进门就开始点名:“说吧,你是什么垃圾?”这次又轮到哪批变量消失?
警告
“警告!警告!警告!” JavaScript 执行大厅传出了刺耳的警告声。
“报告:内存即将溢出,请及时清理无效的内存占用,释放资源!” 伴随着阵阵的警告铃声,大厅正中的大屏幕上显示出了警告信息。
“什么情况?页面才打开一会儿,内存占用就这么高?这都已经清理好几次了!” JavaScript 主线程,也就是执行大厅的老大,疑惑地说道:“看来又得去变量大厅瞧瞧了!”
说着,JavaScript 主线程放下了手头的工作,赶忙往 变量大厅 走去。
变量大厅
“挤死了,你过去点!” 还未到 变量大厅 的 JavaScript 老大远远就听到了这骂骂咧咧的声音。
“不行啊,那边已经挤满了变量!”
“挤一挤啊,我这半只脚还在外面呢!”
“什么?你再说一遍!太吵了,听不清!”
JavaScript 老大发现事情即将失控,要是再不及时清理,这些变量就要造反了。他下意识地跑了起来。
不一会,JavaScript 主线程终于跑到了变量大厅,跑到了大厅前的看台,环顾看了一下。
整个大厅被分成了 3 个区域:两块较小的 新生区,其中标着 FROM 的区域挤满了变量,标着 TO 的区域空空如也;还有一块占地更大的 老生区,此刻也快被挤满了。
“行了,都别吵了!” JavaScript 老大大声喊道:“我来回收内存了!”
“赶紧赶紧,我后面还有变量要进来。” 刚刚那半只脚还在大厅外的变量说道。
点名
“全局对象,你给我出来!” JavaScript 老大喊道。
“在这,在这!” 老生区 中传出了急切的声音:“您可算来了,我都快被挤死了,这次可要把我在的 老生区 也给清理清理!”
“就你最胖,你占的空间最多!” 老生区 中的其他变量嘟囔着。
“谁让我是老大!没我,你们都不可能在这活着!”
“行了!行了!赶紧上来看看吧,这里已经快被挤爆了,你们 老生区 的内存也快挤满了!”
“行!交给我吧!” 说着,全局对象 从兜里掏出了一包指针,说道:“接下来我开始点名,叫到的就继续报你存的变量引用!现在开始!”
“对象 OA!” 全局对象喊道。
“在这儿!” 兴奋的喊声从 老生区 传出,“那我也开始了!你先等我报完。”
“那么你开始吧!” 全局对象说道。
“变量 VA!”
“到!我是基础类型,没有对别的变量的引用!OA 你继续吧!”
“嗯!函数 FA!” 全局对象继续喊道。
“到!那么现在我开始报我所保存的变量的引用!对象 OA 你等等!”
“嗯!你开始吧!”
“...”
过了一会儿,全局对象 终于开始点第二个名字。
“...”
又过了好一会,全局对象 终于也报完了名。
“行,现在大家都知道自己是否被点名了。接下来交给我,你先回去吧。” JavaScript 老大对 全局对象 说道。
你是什么垃圾?
说着 JavaScript 老大走到了 新生区,这里挤着满满的新生变量,看着一个个陌生的面孔,JavaScript 老大走到第一个变量面前。
“说吧!你是什么垃圾?”
“垃圾?我不是垃圾啊!”
“你被点到名了?”
“没有。”
“那你就是垃圾!待这吧。” 说着 JavaScript 老大走到了下一个变量面前。
“你呢?是什么垃圾?”
“我应该是可回收的!” 说着这个变量做了个鬼脸。
“看来你知道了自己的命运啊,待这吧!” JavaScript 老大继续往后走。
“你呢?”
“我不是垃圾哦,我可被点到名了!”
“看把你得意的!去 TO 那边吧!” JavaScript 老大指了指另一块 新生区 TO。
“好嘞 ~” 说着,变量蹦蹦跳跳的跑了过去。
JavaScript 老大继续往后走着...
“终于结束了,好了,现在还在这 FROM 中的变量自己乖点,给我消失!”
“咻”的一下,FROM 所指向的新生区被瞬间清空,整个变量大厅顿时空旷了不少。
看着空空的 FROM,JavaScript 老大拿起放在空区前面的 FROM 标志,与 TO 标志换了换,满意的点了点头。
老生代
“老大,老大,老生区这边也清一清吧!” 全局对象喊道。
“这就来!”
转眼间,JavaScript 老大来到 老生区 的第一个位置,看了一眼 全局对象。
“你懂的!我不是垃圾。我要是垃圾,那在座的可就都是垃圾了!” 全局对象 不慌不忙地说。
“就你厉害,你还不是我生成的!”
“但谁让我是在这里长期存活的根对象呢!” 全局对象 得意地说。
“看把你骄傲的!行,我去看下一个了。” 说着 JavaScript 老大走向了下一个变量。
“你呢?” JavaScript 老大问道。
“我是 Object 对象,直接隶属于 全局对象。”
“哟,一个个的,骄傲的啊。”
……终于,全局对象能够触达的变量都确认完了。
“你是什么垃圾?” JavaScript 老大知道酱油时间已经过去,提了提神。
“我可被点到了两次名!” 说完该变量骄傲的抬起了头。
“看把你神气的。”
“你呢?” JavaScript 老大对下一个变量问道。
“我是垃圾。” 变量委屈的低下了头。
“自己消失还是我帮你一把?”
“我自己消失,不需要您动手。” 说话间,该变量所在的位置瞬间空了出来。
“哟!占用不少空间啊!”
...
JavaScript 老大继续往下走,一个个不可达变量占据的空间被释放出来。
“你们这 老生区 的空间暂时还够,我先不整理碎片了,等下次再来处理。我那边还忙着呢。” JavaScript 老大说着走出了 变量大厅。
“好勒!您慢走 ~” 全局变量 说道。
再次来访
过了一会,处在执行大厅的 JavaScript 老大放下手中的工作,瞧了大厅内的监视面板,内存使用量再次达到了阈值,趁还没发出警告,再次动身走向了 变量大厅。
“哟!老大,您又来啦 ~” 全局对象 看到 JavaScript 老大走到看台,赶忙迎了上去。
“行,你来了,开始点名吧。”
“得嘞 ~”
应答声此起彼伏,这次明显比上一次快了不少。
“行,你回去吧,接下来交给我。” 说着 JavaScript 老大向 FROM 走去。
“看你上次也在这啊,这次被点到名了吗?” JavaScript 老大对第一个变量问道。
“那必须的,这次也点到了!”
“OK 那你去 老生区 找个合适的位置待着吧。”
“好的!” 刚晋升到 老生区 的变量一脸得意的向那个宽敞的 老生区 走去。
“上次没见过你,说吧,你是什么垃圾?”
“我....”
“行了,我知道了,你就待这吧!”
……相似的过程再次上演。不过在后续问话时,JavaScript 老大发现了一个问题:TO 的空间已经被占用了不少。
“不能再往 TO 里面塞变量啦,不然等下新建的变量就没地方待了!” JavaScript 老大心想道。
“你是垃圾吗?” JavaScript 老大对下一个变量说道。
“我不是垃圾,我被点到名了!”
“emmm……那你去老生区吧!” JavaScript 老大想了想说道。
“真的?” 被问话的变量眼神亮了起来。
“行了,去吧,服从安排!”
... 之后,所有被点到名的新变量都被 JavaScript 老大安排在了 老生区。
碎片整理
处理完 新生区 的变量后,JavaScript 老大走向 老生区,相似的过程再次上演。
“老大老大,整理一下空间!” 全局变量 还记着之前 JavaScript 老大说的话。
“那这次就给你们整理一下吧!之前清掉不少变量,空位散得到处都是。大家看见前面有空位就往前坐!”
“得嘞!” 老生区 的变量们开始了熙熙攘攘的移动,不一会,就坐的整整齐齐。
“好了,整理也整理了,那我走了哈 ~”
“得嘞,您慢走 ~~”
消逝
随着屏幕上的指针点中页面标签的关闭按钮,JavaScript 主线程放下手中的工作,熙熙攘攘的变量大厅也瞬间安静下来。不一会儿,整个页面的执行环境便被释放了。
一阵风吹过,吹起了点点尘埃。