GC Safepoint

  • 如果要触发一次GC,那么JVM中所有Java线程都必须到达安全点(Safepoint)或者安全区域(SafeRegion)
  • 只有GC Safepoint是不足的,因为我们发现,有一种情况:线程处于阻塞或等待状态,此时线程无法响应JVM的中断请求,也无法去轮询标志位
  • JVM只会在特定位置放置safepoint,比如:
    • 内存分配的地方(allocation,即new一个新对象的时候)
    • 长时间执行区块结束的时刻(如方法调用,循环跳转等)
  • 之所以只在特定的位置放置safepoint,是因为OopMap要占用空间,如果设太多safepoint那么占用空间会太大;
  • HotSpot JVM在通过JIT编译时,会在所有方法返回之前以及循环跳转异常跳转之前放置Safepoint,并且在每个Safepoint都生成一些信息存储哪些地方是引用(OopMap),以便JVM能找到需要的引用。
posted @ 2021-03-10 17:08  rm-rf*  阅读(116)  评论(0编辑  收藏  举报