【一文讲清楚 JVM Safe Point】
文章插图
大家好 , 我是树哥 。
关于 Safe Point 是 JVM 中很关键的一个概念 , 但我估计有不少同学不是很懂 。于是今天跟大家来深入聊聊 Safe Point , 希望通过这篇文章能解答这样几个问题:
- 什么是 Safe Point?
- 为啥需要 Safe Point?
- Safe Point 与 Stop the World 的关系?
为什么让大家更加场景化地理解 Safe Point 这个概念 , 可以设想如下场景:
- 当需要 GC 时 , 需要知道哪些对象还被使用 , 或者已经不被使用可以回收了 , 这样就需要每个线程的对象使用情况 。
- 对于偏向锁(Biased Lock) , 在高并发时想要解除偏置 , 需要线程状态还有获取锁的线程的精确信息 。
- 对方法进行即时编译优化(OSR 栈上替换) , 或者反优化(bailout 栈上反优化) , 这需要线程究竟运行到方法的哪里的信息 。
因此 , 我们可以将 Safe Point 理解成代码执行过程中的一些特殊位置 , 当线程执行到这个位置时 , 线程可以暂停 。Safe Point 处保存了其他位置没有的一些当前线程信息 , 可以提供给其他线程读取 , 这些信息包括:线程上下文信息 , 对象的内部指针等 。
而 Stop the World 就是所有线程同时进入 Safe Point 并停留在那里 , 等待 JVM 进行内存分析扫描 , 接着进行内存垃圾回收的时间 。
为啥需要 Safe Point前面我们说到 , Safe Point 其实就是一个代码的特殊位置 , 在这个位置时线程可以暂停下来 。而当我们进行 GC 的时候 , 所有线程都要进入到 Safe Point 处 , 才可以进行内存的分析及垃圾回收 。根据这个过程 , 其实我们可以看到:Safe Point 其实就是栅栏的作用 , 让所有线程停下来 , 否则如果所有线程都在运行的话 , JVM 无法进行对象引用的分析 , 那么也无法进行垃圾回收了 。
此外 , 另一个重要的 Java 线程特性 —— interrupted 也是根据 Safe Point 实现的 。当我们在代码里写入
Thread.interrupt()
时 , 只有线程运行到 Safe Point 处时才知道是否发生了 interrupted 。因此 , Safe Point 也承担了存储线程通信的功能 。总结简单地说 , Safe Point 就是人为规定出的一些代码位置 , 在这些位置上线程可以暂停下来 , 从而让 JVM 可以进行内存对象引用分析等操作 。此外 , Safe Point 处也会存储一些特殊的信息 , 从而支持 Java 的某些特性 , 例如:Java 的 interrupt 特性需要到 Safe Point 处才能知道 。
经验总结扩展阅读
- 一文读懂Apache Geode缓存中间件
- 一文搞定 Spring事务
- 可爱在性感面前一文不值是什么意思?
- 一文带你读懂小米手环6和7的区别 小米手环7比6多了什么功能
- 一文看懂华为充电新技术 华为mate30支持无线充电吗
- 苹果如何录入nfc门禁卡 (一文了解iPhone手机添加门禁卡的方法)
- cad表格怎么统一文字高度?
- 牵手一文有哪些方面的含义 牵手一文都有哪些方面的含义
- 诗人雷抒雁在《自己的鞋子》一文中 追求爱情时,唯有不过于理想化,才能拥有安稳美好的爱情
- 杭州|杭州亲姐妹“抢房大战”变仇人:在利益面前,亲情不值一文