垃圾回收之Stop the World、对象消失问题
一、Stop the World!
为什么垃圾回收可达性分析枚举根节点阶段需要Stop the World——暂停所有用户线程!!!而不是像可达性分析标记阶段那样和用户线程并发😠
一个很简单的道理: 我不能一边移动物品一边记录它们的位置,这无异于刻舟求剑
考虑这样一种情况:如果根节点枚举通过一个用户线程变量(程序上下文)获取了一个根节点对象——可达性分析是对对象进行分析,变量不应该作为一个对象,变量空间由Java栈管理。
考虑在并发过程中,用户线程抛弃了我们刚才枚举的对象,转而指向了另一个对象,也就是说我们选取了一个完全错误的无用对象作为根节点,而本应该统计的却“失联”了?这也太糟糕了吧!!!
其实对象不会“失联”,因为变量指向一个对象之前,该对象应该要是可达的,也就是本来可达的对象才能被“使用”——这里只是会产生较多的浮动垃圾…
这也就是在根节