15. StopTheWorld、OopMap、安全点

打印 上一主题 下一主题

主题 1875|帖子 1875|积分 5625

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在Java虚拟机(JVM)中,Stop The World(STW)OopMap(Ordinary Object Pointer Map)安全点(Safe Point) 是垃圾回收(GC)和步伐执行的关键机制,直接影响步伐的性能和响应时间。以下是它们的详细解析:

一、Stop The World(STW)

1. 定义与触发场景



  • 定义:STW指JVM暂停所有应用线程(即“天下制止”)以执行某些全局操纵(如垃圾回收、代码反优化等)。
  • 触发场景

    • 垃圾回收:标记-扫除、标记-整理、Young GC、Full GC等阶段均需STW。
    • 类卸载:卸载不再利用的类时。
    • 代码反优化:动态优化后的代码需要回退(如去优化热门代码)。

2. 影响与优化目标



  • 影响:STW期间所有效户线程暂停,导致服务延迟(如高并发场景下GC停顿直接影响用户体验)。
  • 优化目标:减少STW的 频率连续时间(如G1/CMS/ZGC等收集器的焦点设计目标)。
3. 示例与参数



  • 参数监控

    • -XX:+PrintGC:打印GC日志,显示STW时间。
    • -XX:+PrintGCDetails:显示详细GC停顿时间。

  • 日志示例
    1. [GC (Allocation Failure) [PSYoungGen: 65536K->1024K(76288K)] 65536K->1024K(251392K), 0.0023453 secs]
    复制代码
    其中0.0023453 secs为STW时间。

二、OopMap(Ordinary Object Pointer Map)

1. 作用与原理



  • 作用:记录线程栈和寄存器中哪些位置存放着 对象引用(OOP),用于快速遍历GC Roots。
  • 原理

    • 在特定位置(如方法调用、循环跳转处)生成OopMap。
    • 在GC时,直接查询OopMap定位所有根对象,无需扫描整个栈帧。

2. 上风与实现



  • 上风:避免全栈扫描,显着提拔GC服从,减少STW时间。
  • 实现

    • 表明执行:JVM在字节码表明执行时记录OopMap。
    • 即时编译(JIT):在编译生成机器码时插入OopMap信息(如HotSpot的“写屏障”技能)。

3. 示例



  • 代码片断
    1. void method() {
    2.     Object obj = new Object(); // OopMap记录obj在栈中的位置
    3.     System.out.println(obj);
    4. }
    复制代码
  • 对应OopMap:记录obj在栈帧的偏移量(如ebp-8)。

三、安全点(Safe Point)

1. 定义与作用



  • 定义:步伐执行中的特定位置,线程到达此处时可安全暂停(如举行GC)。
  • 作用:确保所有线程在可预测的状态下暂停,避免因线程状态不一致导致GC错误。
2. 安全点的选择



  • 常见位置

    • 方法调用:调用方法前后(栈帧稳定)。
    • 循环跳转:循环的末端(避免长循环无法进入安全点)。
    • 异常抛出:异常处置惩罚路径。

  • 避免安全点过多:过多安全点会增长运行时开销。
3. 线程如何到达安全点



  • 自动式:线程执行到安全点时自动查抄是否需要暂停。
  • 被动式:通过 轮询标记(如内存页不可读触发制止),逼迫线程进入安全点。
4. 安全地区(Safe Region)



  • 定义:一段代码地区,线程在此地区内的任意位置均可安全暂停。
  • 实用场景:线程处于阻塞或休眠状态(如等候I/O、锁),无需自动轮询安全点。

四、三者的协同工作流程

垃圾回收 为例,说明STW、OopMap和安全点的协作:

  • 触发GC:堆内存不足时,JVM决定执行GC。
  • 进入安全点

    • JVM设置全局安全点标记。
    • 所有运行中的线程轮询该标记,发现后挂起,直到到达最近的安全点。

  • 生成OopMap

    • 根据线程栈和寄存器的OopMap信息,快速枚举所有GC Roots。

  • STW执行GC

    • 暂停所有线程,执行标记、扫除等操纵。

  • 恢复执行

    • GC完成后,扫除安全点标记,线程继续执行。


五、优化与题目排查

1. 减少STW时间



  • 选择低延迟收集器:如ZGC(目标停顿时间<10ms)、Shenandoah。
  • 调解堆大小:避免频仍GC(如增大-Xmx)。
  • 减少内存分配速率:优化代码,减少临时对象创建。
2. 安全点相干性能题目



  • 安全点偏差(Safe Point Bias)

    • 线程长时间未进入安全点(如执行长时间循环),导致GC等候。
    • 解决方案:在循环中参加安全点查抄(如利用-XX:+UseCountedLoopSafepoints)。

  • 日志分析

    • -XX:+PrintSafepointStatistics:检察安全点统计信息。
    • 关注spin time(等候线程进入安全点的时间)。

3. 示例:安全点导致的长时间STW

  1. // 一个未设置安全点的长循环
  2. void longLoop() {
  3.     for (int i = 0; i < 1_000_000_000; i++) {
  4.         // 未包含安全点检查,可能导致GC长时间等待
  5.     }
  6. }
复制代码


  • 优化:利用-XX:+UseCountedLoopSafepoints,或在循环体内调用空方法(隐式插入安全点)。

六、总结

机制焦点作用关键点Stop The World暂停所有线程,确保GC等操纵的一致性优化目标是减少停顿时间和频率OopMap快速定位GC Roots,避免全栈扫描在安全点生成,依赖编译器和表明器记录安全点定义线程可安全暂停的位置选择位置影响GC服从和线程响应延迟 理解这些机制,联合JVM参数调优和代码优化,可显着低落GC对应用性能的影响,提拔系统吞吐量和响应速度。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

老婆出轨

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表