什么是 Stop The World ? 什么是 OopMap ?什么是安全点?

进行垃圾回收的过程中,会涉及对象的移动。为了确保对象引用的更新正确性,必须暂停所有的用户线程,这种暂停被虚拟机设计者形象地描述为“Stop The World”,也简称为STW。

在HotSpot虚拟机中,存在一种数据结构(映射表)称为OopMap。当类加载动作完成时,HotSpot会计算出对象内各个偏移量上所存储的数据类型,并将其记录到OopMap中。在即时编译过程中,也会在特定位置生成OopMap,记录栈上和寄存器中哪些位置存储了引用。

这些特定位置主要包括:

    1. 非计数循环的末尾
    1. 方法返回前或调用方法的call指令后
    1. 可能抛出异常的位置

这些位置被称为安全点(safepoint)。在用户程序执行时,并非在代码指令流的任意位置都能够暂停开始进行垃圾收集,必须在达到安全点时才能进行暂停。

用通俗的比喻来说,假设有个人叫老王去拉一辆重物的车,老王累得满头大汗。但老王不能在上坡或下坡的位置休息,只能在平地上停下来擦擦汗,喝口水。

标签: java, Java面试题, Java问题合集, Java编程, Java问题精选, Java常见问题