美文网首页
每日一面 - JVM 何时会 Stop the world

每日一面 - JVM 何时会 Stop the world

作者: 干货满满张哈希 | 来源:发表于2021-01-17 08:25 被阅读0次
    1. 定时进入 SafePoint:每经过-XX:GuaranteedSafepointInterval 配置的时间,都会让所有线程进入 Safepoint,一旦所有线程都进入,立刻从 Safepoint 恢复。这个定时主要是为了一些没必要立刻 Stop the world 的任务执行,可以设置-XX:GuaranteedSafepointInterval=0关闭这个定时,我推荐是关闭。
    2. 由于 jstack,jmap 和 jstat 等命令,也就是 Signal Dispatcher 线程要处理的大部分命令,都会导致 Stop the world:这种命令都需要采集堆栈信息,所以需要所有线程进入 Safepoint 并暂停。
    3. 偏向锁取消(这个不一定会引发整体的 Stop the world,参考JEP 312: Thread-Local Handshakes):Java 认为,锁大部分情况是没有竞争的(某个同步块大多数情况都不会出现多线程同时竞争锁),所以可以通过偏向来提高性能。即在无竞争时,之前获得锁的线程再次获得锁时,会判断是否偏向锁指向我,那么该线程将不用再次获得锁,直接就可以进入同步块。但是高并发的情况下,偏向锁会经常失效,导致需要取消偏向锁,取消偏向锁的时候,需要 Stop the world,因为要获取每个线程使用锁的状态以及运行状态。
    4. Java Instrument 导致的 Agent 加载以及类的重定义:由于涉及到类重定义,需要修改栈上和这个类相关的信息,所以需要 Stop the world
    5. Java Code Cache相关:当发生 JIT 编译优化或者去优化,需要 OSR 或者 Bailout 或者清理代码缓存的时候,由于需要读取线程执行的方法以及改变线程执行的方法,所以需要 Stop the world
    6. GC:这个由于需要每个线程的对象使用信息,以及回收一些对象,释放某些堆内存或者直接内存,所以需要 Stop the world
    7. JFR 的一些事件:如果开启了 JFR 的 OldObject 采集,这个是定时采集一些存活时间比较久的对象,所以需要 Stop the world。同时,JFR 在 dump 的时候,由于每个线程都有一个 JFR 事件的 buffer,需要将 buffer 中的事件采集出来,所以需要 Stop the world。
    8. 其他的事件,不经常遇到,可以参考 JVM 源码 vmOperations.hpp:
    #define VM_OPS_DO(template)                       \
      template(None)                                  \
      template(Cleanup)                               \
      template(ThreadDump)                            \
      template(PrintThreads)                          \
      template(FindDeadlocks)                         \
      template(ClearICs)                              \
      template(ForceSafepoint)                        \
      template(ForceAsyncSafepoint)                   \
      template(DeoptimizeFrame)                       \
      template(DeoptimizeAll)                         \
      template(ZombieAll)                             \
      template(Verify)                                \
      template(PrintJNI)                              \
      template(HeapDumper)                            \
      template(DeoptimizeTheWorld)                    \
      template(CollectForMetadataAllocation)          \
      template(GC_HeapInspection)                     \
      template(GenCollectFull)                        \
      template(GenCollectFullConcurrent)              \
      template(GenCollectForAllocation)               \
      template(ParallelGCFailedAllocation)            \
      template(ParallelGCSystemGC)                    \
      template(G1CollectForAllocation)                \
      template(G1CollectFull)                         \
      template(G1Concurrent)                          \
      template(G1TryInitiateConcMark)                 \
      template(ZMarkStart)                            \
      template(ZMarkEnd)                              \
      template(ZRelocateStart)                        \
      template(ZVerify)                               \
      template(HandshakeOneThread)                    \
      template(HandshakeAllThreads)                   \
      template(HandshakeFallback)                     \
      template(EnableBiasedLocking)                   \
      template(BulkRevokeBias)                        \
      template(PopulateDumpSharedSpace)               \
      template(JNIFunctionTableCopier)                \
      template(RedefineClasses)                       \
      template(UpdateForPopTopFrame)                  \
      template(SetFramePop)                           \
      template(GetObjectMonitorUsage)                 \
      template(GetAllStackTraces)                     \
      template(GetThreadListStackTraces)              \
      template(GetFrameCount)                         \
      template(GetFrameLocation)                      \
      template(ChangeBreakpoints)                     \
      template(GetOrSetLocal)                         \
      template(GetCurrentLocation)                    \
      template(ChangeSingleStep)                      \
      template(HeapWalkOperation)                     \
      template(HeapIterateOperation)                  \
      template(ReportJavaOutOfMemory)                 \
      template(JFRCheckpoint)                         \
      template(ShenandoahFullGC)                      \
      template(ShenandoahInitMark)                    \
      template(ShenandoahFinalMarkStartEvac)          \
      template(ShenandoahInitUpdateRefs)              \
      template(ShenandoahFinalUpdateRefs)             \
      template(ShenandoahDegeneratedGC)               \
      template(Exit)                                  \
      template(LinuxDllLoad)                          \
      template(RotateGCLog)                           \
      template(WhiteBoxOperation)                     \
      template(JVMCIResizeCounters)                   \
      template(ClassLoaderStatsOperation)             \
      template(ClassLoaderHierarchyOperation)         \
      template(DumpHashtable)                         \
      template(DumpTouchedMethods)                    \
      template(PrintCompileQueue)                     \
      template(PrintClassHierarchy)                   \
      template(ThreadSuspend)                         \
      template(ThreadsSuspendJVMTI)                   \
      template(ICBufferFull)                          \
      template(ScavengeMonitors)                      \
      template(PrintMetadata)                         \
      template(GTestExecuteAtSafepoint)               \
      template(JFROldObject)                          \
    

    相关文章

      网友评论

          本文标题:每日一面 - JVM 何时会 Stop the world

          本文链接:https://www.haomeiwen.com/subject/jjhaaktx.html